El filtro add_filter no funciona como se espera en WordPress

6 abr 2015, 17:05:21
Vistas: 15.2K
Votos: 1

Tengo un plugin de WordPress donde incluí este código (con algunos cambios):

$fep_files = array(
    'first' => 'first.php',
    'second' => 'second.php'
);

$fep_files = apply_filters('include_files', $fep_files );

foreach ( $fep_files as $fep_file )
require_once ( $fep_file );
unset ( $fep_files );

Ahora agregué en el functions.php de mi tema:

function fep_remove ( $fep_files )
{
    if ( isset ( $fep_files['first'] ) ) {
        unset ( $fep_files['first'] );
    }
    //die($fep_files); //para verificar si se ejecuta
    return $fep_files;
}

add_filter( 'include_files', 'fep_remove' );

Debería eliminar first.php pero no lo hace. ¿Estoy cometiendo algún error? ¿Hay alguna mejor manera de incluir archivos donde el usuario pueda incluir/excluir archivos según sea necesario?

6
Comentarios

¿Estás seguro de que el código del plugin se ejecuta después de que el tema se haya cargado?

fuxia fuxia
6 abr 2015 17:08:26

¿Cómo estar seguro? ¿Hay alguna mejor manera de incluir archivos donde el usuario pueda incluir/excluir archivos si es necesario (usando hooks)?

Shamim Hasan Shamim Hasan
6 abr 2015 17:18:10

Sugeriría comenzar asegurándote de que no tienes una colisión de namespaces. Llama a tu hook algo como 'myplugin_include_files' (donde "myplugin" es algo que represente tu plugin). Nombrar el hook de manera demasiado simple podría generar un conflicto.

butlerblog butlerblog
6 abr 2015 17:40:25

Tu código funciona cuando lo pruebo. Eso va a hacer difícil determinar dónde está tu problema particular. Debo señalar que requerir código hardcodeado en un tema para que un plugin funcione es bastante mala práctica.

s_ha_dum s_ha_dum
6 abr 2015 18:21:09

En código real de plugins, los hooks no son demasiado simples.

Shamim Hasan Shamim Hasan
6 abr 2015 19:40:18

¿Cómo lo probaste @s_ha_dum? El primer código (que incluye apply_filters) está en mi plugin (archivo principal que incluye la información del plugin) para que pueda incluir otros archivos requeridos para ese plugin. También agregué apply_filters para que cualquiera pueda incluir/excluir cualquier archivo sin cambiar el código núcleo del plugin. Ahora, si alguien quiere excluir first.php de ese código, él/ella agrega el código (en mi pregunta que tiene add_filter) en el functions.php de su tema. ¿Qué tan malo es esto?

Shamim Hasan Shamim Hasan
6 abr 2015 19:50:41
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 3
1

Creo que es necesario actualizar algunas de las respuestas aquí. (Solo para cuando yo u otras personas lleguemos a esta página en el futuro buscando una respuesta).

El orden de los plugins parece depender del tipo de instalación de WordPress con la que estés trabajando. Si estás trabajando con una instalación Multisite, entonces los plugins efectivamente se procesan en el orden en que se activan.

Sin embargo, en una instalación simple de WordPress, se activan alfabéticamente. Por lo tanto, si te encuentras con un problema donde necesitas actualizar un filtro de inicialización o una acción para otro plugin, tu mejor opción es nombrar tu plugin con algo que comience con un guión bajo.

Por ejemplo: _mi_plugin_personalizado/mi_plugin_personalizado.php

Como referencia, por favor revisa las líneas 704-713 en wp-admin/includes/plugin.php

21 dic 2020 11:05:34
Comentarios

Hmm, creo que deberías confiar en un hook, por ejemplo, un manejador de plugins_loaded con alta prioridad, en lugar del orden alfabético, pero esta es información útil - gracias

Rup Rup
21 dic 2020 12:02:45
1

El código de tu plugin se ejecutará antes que el código del tema y, por lo tanto, se ejecutará antes de que se agregue cualquier cosa al hook. Necesitarás mover el código que procesa la inclusión del archivo a algún otro hook que se ejecute después de que todos los plugins se carguen, como after_setup_theme.

Esto podría ayudarte: ¿Existe un diagrama de flujo para la secuencia de carga de WordPress?

7 abr 2015 02:48:46
Comentarios

Ya había hecho eso y ahora está funcionando perfectamente. También me diste la misma solución. Acepto tu respuesta también.

Shamim Hasan Shamim Hasan
7 abr 2015 17:22:37
1
-1

La respuesta anterior era excelente en cuanto al orden, pero no pude entender cómo hacer que el filtro/hook funcione con esas instrucciones.

Mi solución fue crear un plugin personalizado que contenga el filtro, asegurándome de que alfabéticamente venga antes que el plugin que contiene el filtro al que quiero agregar.

En otras palabras, colocar el código en plugins/a-custom-plugin.php comenzando el archivo con:

<?php
/*
Plugin Name: Mi Plugin Personalizado
*/
26 ene 2016 04:12:49
Comentarios

Los plugins no se ejecutan en orden alfabético; de hecho, se ejecutan en el orden de activación, ya que cuando se activa un plugin, se agrega al array de plugins activos almacenado en la base de datos. ( wp_options -> active_plugins )

Bysander Bysander
19 mar 2020 13:46:56