add_action en el espacio de nombres no funciona

2

Decidí ponerle un espacio de nombre a mi complemento, y lo hice funcionar todo, excepto en mi archivo de complemento principal.

Agregué dos acciones en ese complemento, antes de llamar al método init del complemento.

<?php
namespace myPlugin;

add_action( 'admin_init', 'add_activation_notice' );

function add_activation_notice() {
    add_action( 'admin_notices', 'activation_notice' );
}

function activation_notice() {
    echo 'Notice!';
}

Pero esto arroja un error

  

Error no detectado : constante indefinida 'myPlugin \ myPlugin \ add_activation_notice'

Soy bastante nuevo en el espacio de nombres, así que no sé por qué sucede esto.

Las dos funciones add_activation_notice y activation_notice están en el espacio de nombres myPlugin . La mayoría del código encontré métodos de referencia en línea dentro de las clases, pero necesito que estén fuera de una clase para poder tener un aviso de activación del complemento.

EDITAR:

Cuando intento con

add_action( 'admin_init', \add_activation_notice() );

me sale

  

Error grave : Error no detectado: llamar a la función indefinida add_activation_notice ()

    
pregunta dingo_d 03.11.2017 - 15:16

2 respuestas

5

Antes de ir demasiado lejos por este camino, te sugiero que te familiarices con reglas de resolución de nombres de PHP .

Para responder a tu pregunta actual -

Cuando realiza funciones de espacio de nombres, el nombre completo de esas funciones incluye el espacio de nombres.

En tu ejemplo, has definido dos funciones: \myPlugin\add_activation_notice y \myPlugin\activation_notice .

Al llamar a cualquiera de estos desde el espacio de nombres myPlugin , puedes usar el nombre no calificado (es decir, activation_notice() ) pero fuera del espacio de nombres myPlugin tienes que seguir las reglas de resolución de nombres vinculadas anteriormente.

En el caso de add_action() - mientras que esto se llama desde su espacio de nombres myPlugin , no está pasando la función real sino el nombre de la función como una cadena. WordPress más tarde intenta llamar a esa función desde el espacio de nombres global.

La solución a su problema debe ser incluir el espacio de nombres myPlugin en el nombre de la función que se pasa a add_action (preste especial atención a la barra invertida que se escapó):

add_action( 'admin_init', 'myPlugin\add_activation_notice' );
add_action( 'admin_notice', 'myPlugin\activation_notice' );

Mi método preferido para hacer esto sería mediante la concatenación del __NAMESPACE__ constante mágica lo que simplifica un poco las cosas si alguna vez decides cambiar tus espacios de nombres:

add_action( 'admin_init', __NAMESPACE__ . '\add_activation_notice' );
add_action( 'admin_notice', __NAMESPACE__ . '\activation_notice' );
    
respondido por el ssnepenthe 03.11.2017 - 16:51
2

La forma más fácil sería encerrar su código entre llaves:

namespace myPlugin {

    add_action( 'admin_init', __NAMESPACE__ . '\add_activation_notice' );

    function add_activation_notice() {
        add_action( 'admin_notice', __NAMESPACE__ . '\activation_notice' );
    }

    function activation_notice() {
        echo 'Notice!';
    }
}

De lo contrario, su acción buscará la función activation_notice en un espacio de nombres global.

Actualizar

No hay admin_notice hook. Use admin_notices en su lugar. Prueba:

namespace myPlugin {
    add_action( 'admin_init', __NAMESPACE__ . '\add_activation_notice');

    function add_activation_notice() {
        add_action( 'admin_notices', __NAMESPACE__ . '\activation_notice' );
    }

    function activation_notice() {
    ?>
        <div class="notice notice-info is-dismissible">
            <p><?php echo 'Done!'; ?></p>
        </div>
    <?php
    }
}
    
respondido por el Frank P. Walentynowicz 03.11.2017 - 15:52

Lea otras preguntas en las etiquetas