admin_print_scripts-$hook_suffix funziona per percorsi annidati a file individuali?

11 feb 2011, 12:32:55
Visualizzazioni: 869
Voti: 0

È possibile utilizzare l'hook admin_print_scripts-$hook_suffix per un hook creato come $hookname = get_plugin_page_hookname("my-quiz/lib/admin/$code_page", '' );?

.. dove $code_page è somefilename.php.

Ho provato ma non sembra funzionare. Penso che probabilmente sia a causa del percorso del file?

AGGIORNAMENTO

Quello che viene registrato dal codice sopra è 'admin_page_my-quiz/lib/admin/question_form' ma questo funziona solo in una pagina se fai:

<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('Modifica', 'my-locale'); ?>
        </a>

Devo aggiungere il suffisso .php affinché quel link funzioni, altrimenti ottengo l'errore 'non hai i permessi'.

@t31os la funzione restituisce 'nmsi-quiz/lib/admin/question_form.php' e quindi non corrisponde a 'admin_page_my-quiz/lib/admin/question_form'

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

Codice richiesto:

$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
Commenti

Posso vedere il codice che stai usando per registrare le pagine del plugin, ovvero le chiamate add_menu_page e add_submenu_page (o equivalenti)?

t31os t31os
12 feb 2011 11:05:54

Aggiunto. Mi rendo conto che questo è un modo non standard di fare le cose e che non sto usando add_menu_page(). Questo perché non voglio queste pagine nel menu. Sono consapevole dei problemi legati a questo approccio. http://wordpress.stackexchange.com/questions/7812/what-is-the-recommended-way-to-create-plugin-administration-forms

codecowboy codecowboy
12 feb 2011 13:56:06

Il punto è che non puoi avere pagine registrate che non esistono nel menu, in ogni caso perderai alcune funzionalità se inserisci semplicemente le pagine negli array appropriati, perché il codice core si aspetta che le pagine registrate esistano in una certa misura sia nell'array $menu che $submenu.. Potrei suggerirti di dare un'occhiata alle funzioni add_menu_page e add_submenu_page per vedere cosa fanno con i dati in ingresso (questo ti darà un'idea di cosa fa WordPress con le pagine registrate usando queste funzioni - cioè a quali array aggiunge, ecc.)

t31os t31os
14 feb 2011 17:03:37

Ho aggiunto del codice di esempio e ulteriori commenti alla mia risposta.

t31os t31os
14 feb 2011 18:22:07
Tutte le risposte alla domanda 1
0

Penso che sia davvero una questione di verificare se quel codice restituisce il nome corretto dell'hook per la pagina specificata.

Ecco una semplice funzione che puoi usare per visualizzare il suffisso dell'hook su ogni pagina di amministrazione, apparirà all'interno di un box rosso di errore (quindi sarà facile da individuare) solo per gli amministratori.

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 
}

Carica la pagina con cui hai problemi e confronta il valore che vedi nel box con quello che ottieni dal codice che hai pubblicato.

Aggiunta
Continuando dal mio ultimo commento, puoi effettivamente fare qualcosa del genere...

add_action( 'admin_menu', 'testing_registered_pages', 100 );
function testing_registered_pages() {
    global $_registered_pages, $submenu;
    $plugin_scripts = array( 
        'Modulo Domanda' => array( 'page' => 'question_form', 'callback' => 'my_callback_1' ), 
        'Gestisci Domande' => 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'] );
    }
}

// Rimuovi l'add_action per fare riferimento a file effettivi, lascia per usare una funzione di callback

...c'è solo un problema con questo approccio, ed è la possibilità di eludere i requisiti di capacità delle pagine.

Prendi questo URL.

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

Possiamo eludere il controllo delle capacità cercando...

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

Se modifichiamo il codice precedente per usare l'estensione del file, ad esempio...

    $plugin_scripts = array( 
        'Modulo Domanda' => array( 'page' => 'question_form.php', 'callback' => 'my_callback_1' ), 
        'Gestisci Domande' => array( 'page' => 'manage_questions.php', 'callback' => 'my_callback_2' ) 
    );

..e opzionalmente disabilitiamo le callback, cioè usiamo un file reale...

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

..questo ci dà...

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

..è comunque possibile eludere i requisiti di capacità usando...

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

Indipendentemente dal fatto che tu usi un file effettivo o una funzione di callback, in entrambi i casi i requisiti di capacità (come sopra) possono essere elusi (ovviamente questo non sarebbe un comportamento desiderato).

11 feb 2011 12:50:24