web-dev-qa-db-fra.com

Ajouter un menu administrateur dans Construct ou Init

Je pensais faire des progrès dans ma formation en développement WordPress jusqu'à ce que je croise les plug-ins Boilerplate for WordPress et qu'il utilise un objet de classe. Cela me convient, je comprends ces concepts et je suis un développeur .Net. Mais, pour une raison quelconque, aucun rappel ne peut fonctionner correctement. Tout ce que je veux à ce stade, c’est un menu d’administration et, lorsque vous cliquez sur cet élément de menu, il affiche quelque chose du type "s’IL VOUS PLAÎT ME !!!". Découvrez ce que j'ai ci-dessous et quelqu'un peut-il s'il vous plaît expliquer ce que j'ai tort?

class school_manager {
    function __construct() {
        add_action( 'init', array( $this, 'init' ) );
    }

    public function init(){
            add_action('admin_menu', array(&$this, 'add_admin_menu'));
        }

    public function add_admin_menu(){
        add_menu_page( 'School Manager Settings', 'School Manager', 'administrator', 'school-manager-settings', 'show_admin_settings_page', null ); 
    }

    public function show_admin_settings_page(){
        echo '<p>This is a test for the admin settings page.  Please work!</p>';
    }
}

Mon nouvel élément de menu apparaît (comme c'était le cas lorsque je n'utilisais pas d'objet de classe dans l'architecture de mon plugin. Mais, lorsque je clique sur l'élément de menu, le message d'erreur suivant s'affiche:

Avertissement: call_user_func_array () [function.call-user-func-array]: le premier argument doit être un rappel valide, 'school_manager :: create_admin_page' a été donné dans H:\root\home\xxxxx\wp-includes\plugin .php à la ligne 406

J'essaie de créer un plug-in qui comporte non seulement un menu administrateur et des éléments de sous-menu, mais je souhaite également utiliser l'API de configuration en essayant de suivre cette série . . C'est donc l'un des points cruciaux pour obtenir quelque chose d'aussi simple qu'un élément de menu à fonctionner avant que je puisse continuer.

2
clockwiseq

Le rappel que vous avez donné dans add_menu_page() est une fonction statique, pas une méthode de classe. CA devrait etre:

add_menu_page( 
    'School Manager Settings', 
    'School Manager', 
    'administrator', 
    'school-manager-settings', 
    array ( $this, 'show_admin_settings_page' )
);

Et s'il vous plaît, n'utilisez plus &$this, c'est PHP 4. 4. :)

Mon plugin de démonstration La démonstration du menu d'administration du T5 pourrait aider à comprendre comment cela fonctionne.

3
fuxia