¿Funciona admin_print_scripts-$hook_suffix para rutas anidadas a archivos individuales?

11 feb 2011, 12:32:55
Vistas: 869
Votos: 0

¿Se puede usar el hook admin_print_scripts-$hook_suffix para un hook creado como $hookname = get_plugin_page_hookname("my-quiz/lib/admin/$code_page", '' );?

.. donde $code_page es somefilename.php.

Lo he intentado y no parece funcionar. Creo que probablemente sea debido a la ruta del archivo.

ACTUALIZACIÓN

Lo que registra el código anterior es 'admin_page_my-quiz/lib/admin/question_form' pero esto solo funciona en una página si haces:

<a href="<?php echo admin_url('admin.php?page=my-quiz/lib/admin/question_form.php&question=edit&question='.$question->ID); ?>" class='edit'>
        <?php _e('Editar', 'my-locale'); ?>
        </a>

Debo agregar el sufijo .php para que ese enlace funcione o obtengo el error 'no tienes permiso'.

La función de @t31os devuelve 'nmsi-quiz/lib/admin/question_form.php' y esto no coincide con 'admin_page_my-quiz/lib/admin/question_form'

Esto funciona - add_action( 'admin_print_scripts-'.'my-quiz/lib/admin/question_form.php', array($this,'enqueue_my_js'));

Código solicitado:

$plugin_scripts = array('question_form.php', 'manage_questions.php');

foreach($plugin_scripts as $code_page) {
    $hookname = get_plugin_page_hookname("my-quiz/lib/admin/$code_page", '' );
    $_registered_pages[$hookname] = true;
    //fb($hookname);

}
4
Comentarios

¿Puedo ver el código que estás usando para registrar las páginas del plugin, por favor? Es decir, las llamadas a add_menu_page y add_submenu_page (o equivalentes)..

t31os t31os
12 feb 2011 11:05:54

Agregado. Me doy cuenta de que esta es una forma no estándar de hacer las cosas y que no estoy usando add_menu_page(). Esto es porque no quiero estas páginas en el menú. Soy consciente de los problemas relacionados con esto. http://wordpress.stackexchange.com/questions/7812/what-is-the-recommended-way-to-create-plugin-administration-forms

codecowboy codecowboy
12 feb 2011 13:56:06

El asunto es que no puedes tener páginas registradas que no existan en el menú, de cualquier manera perderás algo de funcionalidad si simplemente hackeas las páginas en los arrays apropiados, porque el código central sí espera que las páginas registradas existan hasta cierto punto tanto en los arrays $menu como $submenu.. ¿Podría sugerirte que eches un vistazo a las funciones add_menu_page y add_submenu_page para ver qué hacen con los datos entrantes? (esto te dará una idea de lo que WordPress hace con las páginas registradas usando estas funciones - es decir, a qué arrays agrega, etc..)

t31os t31os
14 feb 2011 17:03:37

He añadido algo de código de ejemplo y comentarios adicionales a mi respuesta.

t31os t31os
14 feb 2011 18:22:07
Todas las respuestas a la pregunta 1
0

Creo que realmente es una cuestión de si ese código está proporcionando el nombre correcto del hook para la página dada.

Aquí hay una función simple que puedes usar para mostrar el sufijo del hook en cada página de administración, aparecerá dentro de un cuadro de error rojo (para que sea fácil de detectar) solo para administradores.

add_action( 'admin_notices', 'print_admin_pagehook' );
function print_admin_pagehook() {
    global $hook_suffix;
    if( !current_user_can( 'manage_options') )
        return;
    ?>
    <div class="error"><p><?php echo $hook_suffix; ?></p></div>
    <?php 
}

Carga la página con la que tienes problemas y compara el valor que ves en el cuadro con lo que obtienes del código que publicaste.

Adición
Siguiendo con mi último comentario, en realidad puedes hacer algo como esto...

add_action( 'admin_menu', 'testing_registered_pages', 100 );
function testing_registered_pages() {
    global $_registered_pages, $submenu;
    $plugin_scripts = array( 
        'Formulario de Preguntas' => array( 'page' => 'question_form', 'callback' => 'my_callback_1' ), 
        'Gestionar Preguntas' => array( 'page' => 'manage_questions', 'callback' => 'my_callback_2' ) 
    );
    foreach( $plugin_scripts as $title => $my_pages ) {
        $hookname = get_plugin_page_hookname("my-quiz/lib/admin/$my_pages[page]", 'my-quiz' );
        $_registered_pages[$hookname] = true;
        $submenu['my-quiz'][] = array( $title, 'manage_options', "my-quiz/lib/admin/$my_pages[page]", $title );
        add_action( $hookname, $my_pages['callback'] );
    }
}

// Elimina el add_action para hacer referencia a archivos reales, déjalo en su lugar para usar una función de callback

...hay un problema con este enfoque, y es la capacidad de eludir los requisitos de capacidad de las páginas.

Tomemos esta URL.

example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions

Podemos eludir la verificación de capacidad consultando...

example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions.php

Si cambiamos el código anterior para usar la extensión de archivo en su lugar, por ejemplo...

    $plugin_scripts = array( 
        'Formulario de Preguntas' => array( 'page' => 'question_form.php', 'callback' => 'my_callback_1' ), 
        'Gestionar Preguntas' => array( 'page' => 'manage_questions.php', 'callback' => 'my_callback_2' ) 
    );

..y opcionalmente deshabilitar los callbacks, es decir, usar un archivo real...

// add_action( $hookname, $my_pages['callback'] ); 

..esto nos da...

example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions.php

..aún es posible eludir los requisitos de capacidad usando...

example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions

Independientemente de si usas un archivo real o una función de callback, en cualquier caso los requisitos de capacidad (como se mencionó anteriormente) pueden ser eludidos (obviamente esto no sería un comportamiento deseado).

11 feb 2011 12:50:24