Nota: Esta respuesta está aquí solo para facilitar la discusión entre @scribu y @kaiser. Mods: por favor no elimines. Usuarios / lectores: por favor no vote. Si desea seguir la discusión, eche un vistazo al registro de revisión / edición. Si desea unirse a la discusión, edite la Respuesta. Si la discusión tiene un resultado, se marcará como tal. Gracias.
Escenarios
También hay diferentes escenarios que tienen un peso diferente, donde podría tener una dependencia de complemento. (Los ejemplos son solo ficticios). La palabra "Plugin (principal)" se puede intercambiar con "Tema" desde el punto de vista principal.
- (hard) Un complemento secundario que solo extiende la funcionalidad o altera la visualización (y similar) de un complemento existente y, por lo tanto, no puede existir sin el principal. Ejemplo: BuddyPress »BuddyPress-FunkyCommentDisplay
- (normal) Un complemento que tiene una funcionalidad extendida cuando se activa un complemento secundario. Ejemplo: jQueryAttachmentCarousel »jQuerySlideDeck
- (suave) Un complemento que solo agrega una función. Ejemplo: DisneyWonderlandTheme »MickeysSocialLinks
A continuación, trato de esbozar lo que sucede cuando actualizas el complemento "otro" y la comprobación ya no funciona.
- Anuncio 1) El complemento no podría existir sin BuddyPress activado »Las cosas están completamente rotas.
- Anuncio 2) El complemento no podía ofrecer la opción de cambiar de Carrusel a SlideDeck »Pantallas cableadas (supongo que los estilos se modifican a SlideDeck).
- Anuncio 3) MickeysSocialLinks desaparecen.
Cheque
En mi opinión, existen tres posibilidades de verificación, si desea saber si un complemento está activo:
- A. ¿Existe la carpeta?
- B. ¿Existe el archivo principal - opción
'active_plugins'
-?
- C. ¿Existe una función particular?
Si ahora tomo mi complemento de Comprobador de enlaces internos como un ejemplo, que no ofrece API pública y no está destinado a extenderse, entonces no vería ninguna razón (como autor) para no cambiar el nombre de la función interna a pedido o solo por voluntad . Entonces, si alguien intentara aprovechar este complemento, entonces las cosas simplemente se romperían (dependiendo de la funcionalidad y la rigidez de la agrupación) en la actualización. Lo mismo ocurre con los nombres de archivo. No tendría ninguna razón real (aparte de eso, el complemento se desactivaría en la actualización) para no cambiar el nombre del archivo. Lo único que me detendría de cambiar el nombre de la carpeta es que la verificación y notificación de actualización se ejecuta contra el nombre del archivo, si está alojado en el repositorio oficial.
Entonces, diría que la parte más débil (fácil de cambiar) a la más difícil (se habla mucho de cambiar) de un complemento (principal) sería:
función »nombre del archivo principal» carpeta
Cuando dije que una verificación de función es menos frágil que usar is_plugin_active()
, supuse que la función en cuestión es una que el autor del complemento alienta explícitamente. El último ejemplo de esto sería la wp_pagenavi()
etiqueta de plantilla que ofrece el complemento WP-PageNavi.
La dificultad para definir dependencias es que no hay una forma estándar de identificar de manera exclusiva los complementos que no involucran nombres de archivos.
Más pensamientos sobre el tema:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme
Creo que hasta ahora podemos resumirlo en tres puntos:
- Hemos hablado de temas ligeramente diferentes.
- Estamos de acuerdo en que no hay una forma a prueba de balas para evitar lo que pensé que sería el tema
- Desde su comprensión de la pregunta, ofreció un camino válido
La forma (hasta ahora) más inteligente que puedo pensar, que ya he visto en algunos complementos (mucho menos):
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
Sin pensarlo demasiado en detalle, pero supongo que podría conectar su aviso a una verificación en el filtro 'todos' y verificar dentro del filtro actual si se activó cuando está en el shutdown
gancho ...?
Usar ganchos funcionaría bien para dependencias 'normales' y 'débiles'. El único inconveniente es que aún necesitaría usar function_exists()
o is_plugin_active()
si desea detener si no se cumple la dependencia. Usar el filtro 'todos' para eso sería una OMI demasiado costosa.
@scibu Esto estaba dirigido a "su" tema. (Ya dejé de hablar sobre el mío). :)
Básicamente, si necesita una dependencia, y tiene un buen autor, entonces podría ofrecerle un gancho en lugar de una etiqueta de plantilla. Porque el complemento solo se engancharía si el gancho estuviera presente, o simplemente no haría nada. Y, por otro lado, no tendría un error, cuando los complementos no están presentes.
Aquí está la parte difícil (o más de una Q): Para escribir un aviso de administrador para informar al usuario sobre la dependencia "Debe instalar» DisneyWonderLinks «", puede verificar el array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
. No estoy seguro de si esto funcionaría, pero afaik la matriz debería ser accesible en ambos lados (público / administrador).
Eso no funcionaría. El hecho de que una devolución de llamada esté registrada en un enlace no significa que el enlace se activará cuando se espera. Lo único que sería una especie de tipo de trabajo es usar el gancho de "apagado", que mencionó antes:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
Por supuesto, esto se imprimiría en la parte inferior, después de la </html>
etiqueta, en la parte frontal (ya que allí es donde normalmente se usan las etiquetas de plantilla), lo que no es de mucha utilidad.
Podría intentar almacenar el mensaje en wp_options y luego mostrarlo en el área de administración, pero eso abriría una nueva lata de gusanos: invalidación, almacenamiento en caché de complementos, etc.
function_exists
, entonces un usuario normal simplemente recibirá el mensaje de que no ha instalado el complemento en el que se basa otro complemento. El problema es que el usuario realmente tendrá el complemento instalado y luego se preguntará por qué no funciona . Ah, y no voy a rechazarte por eso.