web-dev-qa-db-ja.com

WP プラグイン+ OOP:メニューページを追加しても必要な効果が得られない

だから、私は数日間この問題を見つめてきました。私はPHP開発において私のスキルをさらにプッシュしようとしています、そしてWPアプローチでOOPプラグインに取り組むことにしました。 WPは必ずしもこれに最適な選択ではないことを私は知っていますが、私は良い挑戦が大好きです。

私はHelperクラスを書いています、私はかなり定期的にいくつかの機能を使うつもりですが、私は少し問題にぶつかっています。

ヘルパークラス

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']
        );
    } );

}

ヘルパークラスの使い方

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',
    ]);

    }
}

電流出力

enter image description here

私が試したこと

  1. 配列をforeachループに入れるなぜなら、最初のものを2回返すか、または3つすべてをもう一度返すからです。
  2. オリジナルのルートは物の参考タイプで合格でした。関数から変数を渡してクラス内のグローバル変数に格納します。説明されているのと同じ問題が原因で、まだ動作しない

私の現在の考えは、ヘルパー関数が呼び出されるたびにadd_actionが呼び出されるという事実に加えて、add_actionと無名関数を使用することと関係があるということです。

うまくいけば、誰かがこれに対する解決策のある種の考えを持っています、そしてうまくいけば私は私の問題で十分にはっきりしています。

ありがとう:)

2
EBennett

無名関数の呼び出しはadd_new_pageのすべての実行の後に行われます。その後、メニュー項目を作成するためにすべての要素を格納する必要があります。

そのようにHelperクラスを修正してみてください

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