web-dev-qa-db-fra.com

WP Plugin + OOP: l'ajout d'une page de menu ne crée pas l'effet requis

Donc, je regarde ce problème depuis quelques jours maintenant. J'essaie de pousser mes compétences plus loin dans le développement de PHP et j'ai décidé de m'attaquer à un plugin WP avec une approche OOP. Je sais que WP n'est pas nécessairement le meilleur choix pour cela, mais j'adore les défis.

J'écris une classe Helper, car j'ai l'intention d'utiliser certaines fonctions assez régulièrement, mais je rencontre un petit problème.

Classe d'assistance

Class Helper implements HelperInterface
{

/**
 * Default Options for making an admin page
 *
 * @var array
 */
public $default_options = [
    'slug'          =>      '',
    'title'         =>      '',
    'page_title'    =>      '',
    'parent'        =>      null,
    'id'            =>      '',
    'capability'    =>      'update_core',
    'icon'          =>      'dashicons-admin-generic',
    'position'      =>      null,
    'file_name'     =>      null,
    'desc'          =>      '',
];

/**
 * Store options passed in by user.
 *
 * @var array
 */
public $options = [];

public $parent_id;

public $settings_id;

/**
 * Stores the media type for a stylesheet
 *
 * @var string
 */
public $media_type;

public function __construct(  )
{

}

public function add_new_page( $opt )
{   
    $this->options = array_merge( $this->default_options, $opt );
    add_action( 'admin_menu', function() {

        add_menu_page(
            $this->options['page_title'],
            $this->options['title'],
            $this->options['capability'],
            $this->options['slug'],
            array($this, display_page_template),
            $this->options['icon'],
            $this->options['position']
        );
    } );

}

Utilisation de la classe d'assistance

Class GoogleMaps 
{

protected $helper;

public function __construct()
{
    $this->helper = new Helper;
    $this->helper->add_new_page([
        'slug'          =>      'google-maps',
        'title'         =>      'EdsGoogleMaps',
        'page_title'    =>      'EdsGoogleMaps',
        'capability'    =>      'update_core',
        'icon'          =>      'dashicons-admin-generic',
        'position'      =>      null,
        'file_name'     =>      'GoogleMapsHome.php',
    ]);

    $this->helper->add_new_page([
        'slug'          =>      'google-maps-2',
        'title'         =>      'EdsGoogleMaps2',
        'page_title'    =>      'EdsGoogleMaps2',
        'capability'    =>      'update_core',
        'icon'          =>      'dashicons-admin-generic',
        'position'      =>      null,
        'file_name'     =>      'GoogleMapsHome.php',
    ]);

    $this->helper->add_new_page([
        'slug'          =>      'google-maps-3',
        'title'         =>      'EdsGoogleMaps3',
        'page_title'    =>      'EdsGoogleMaps3',
        'capability'    =>      'update_core',
        'icon'          =>      'dashicons-admin-generic',
        'position'      =>      null,
        'file_name'     =>      'GoogleMapsHome.php',
    ]);

    }
}

Courant de sortie

 enter image description here 

Choses que j'ai essayées

  1. Mettre le tableau dans une boucle foreach. Ne fonctionne pas parce que le premier sera renvoyé deux fois ou tous les trois.
  2. La route originale était comme un passe par type de référence. Passer les variables de la fonction et les stocker dans les vars globaux de la classe. Ne fonctionne toujours pas à cause du même problème que celui décrit

Mon opinion actuelle est que cela a quelque chose à voir avec l'utilisation de add_action et une fonction anonyme, parallèlement au fait que add_action est appelée à chaque fois que la fonction d'assistance est appelée.

J'espère que quelqu'un a en quelque sorte une idée de solution, et j'espère que j'ai été assez clair dans mon problème.

Merci :)

2
EBennett

l'appel à la fonction anonyme est effectué après toutes les exécutions de add_new_page. vous devez ensuite stocker tous les éléments pour créer des éléments de menu.

essayez de modifier la classe Helper comme ça

public function __construct() // method to modify
{

    add_action("admin_menu", [$this, "add_admin_menu_items"]);

}

public function add_new_page( $opt ) // method to modify
{
    $element = array_merge( $this->default_options, $opt );

    $this->options[] = $element;

}


public function add_admin_menu_items() // method to create
{

    $helper = $this;


    foreach ($this->options as $element) {

        add_menu_page(
            $element['page_title'],
            $element['title'],
            $element['capability'],
            $element['slug'],
            function () use ($helper, $element) {

                $helper->display_page_template($element);

            },
            $element['icon'],
            $element['position']
        );

    }


}


public function display_page_template($itemDatas)
{

    ?>

        <pre><?php
            echo htmlspecialchars(var_export($itemDatas, TRUE));
        ?></pre>

    <?php

}

}
3
mmm