web-dev-qa-db-ja.com

作成されたウィジェットが管理パネルに表示されない

wordpress devのチュートリアルに従っています。プラグインから基本的なウィジェットを作成しようとしていますが、

だから私はプラグインディレクトリにこれらの3つのファイルを入れました:

メインプラグインファイル(zero.php):

<?php

/*
Plugin Name: Zero plugin
*/

class Zero_Plugin
{
  public function __construct()
  {
    //...
    include_once plugin_dir_path( __FILE__ ).'/newsletter.php';
    include_once plugin_dir_path( __FILE__ ).'/newsletterwidget.php';
    new Zero_Newsletter();
   }
}

newsletterwidget.php:

<?php
class Zero_Newsletter_Widget extends WP_Widget
{
    public function __construct()
    {
        parent::__construct('zero_newsletter', 'Newsletter', array('description' => 'Un formulaire d\'inscription à la newsletter.'));
    }
    public function widget($args, $instance)
    {
        echo 'widget newsletter';
    }
}

newsletter.php:

<?php
include_once plugin_dir_path( __FILE__ ).'/newsletterwidget.php';
class Zero_Newsletter
{
    public function __construct()
    {
        add_action('widgets_init', function(){register_widget('Zero_Newsletter_Widget');});
    }
}

そのため、管理パネルに移動してプラグインをアクティブにし、appearance -> widgetsに移動します。「Newsletter」というウィジェットが見つかりません。

私はここで立ち往生しています、誰でも助けることができますか?

乾杯

2
Henri

1

メインプラグインファイル(zero.php)に、プラグインオブジェクトの無効なインスタンス化があります。あなたはまだ存在しないオブジェクトの中にオブジェクトを作成しようとしています。

注: オブジェクト内にオブジェクトを作成することは可能ですが、最初に「外の世界」から初期オブジェクトを作成する必要があります(いわゆるクラスの外側のA/K/A)。

あなたはあなたのメインプラグインオブジェクトを作成するためにあなたのメインプラグインファイルにかなり簡単な調整をすることができます。私のzero.phpのバージョンでは、クラスは外部からインスタンス化されていますか?

2

繰り返しますが、メインのプラグインファイル(zero.php)に、ニュースレター(newsletter.php)とニュースレターウィジェット(newsletterwidget.php)の両方を読み込んでいます。ニュースレター(newsletter.php)がロードされたら、もう一度ニュースレターウィジェット(newsletterwidget.php)をロードします(冗長で不要)。私のバージョンのnewsletter.phpnewsletter-widget.phpにおけるファイルのロードとクラスのインスタンス化の変更を観察してください。

3

あなたのnewsletter.phpコンストラクタを見てください。あなたは本当に(あなたが絶対に必要としていない限り)無名関数の使用を避けるべきです。この場合、無名関数を使用することはまったく不要です。


それが言われて、私の調整と以下の解説を見てください。あなたの革新的なプラグインのアイデアで頑張ってください。


Zero_Pluginクラスが行うことに注意してください。その責任は、Newsletterファイル(newsletter.php)をロードし、それをインスタンス化し、そして `newsletter 'のプロパティを設定することです。

./wp-content/plugins/zero/zero.phpの内容:

<?php

/*
Plugin Name: Zero plugin
*/


/**
 * Class Zero_Plugin
 *
 * Main plugin file to do whatever it is that your plugin does.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 */
class Zero_Plugin {

    /**
     * @var null
     */
    public $newsletter = null;

    /**
     * Zero_Plugin constructor.
     *
     * Load the newsletter functionality.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     */
    public function __construct() {

        $this->load_newsletter();

    }

    /**
     * Load the Newsletter file, then instantiate the newsletter class, and assign it a property of this class.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     * @return bool
     *
     */
    private function load_newsletter() {

        require_once( plugin_dir_path( __FILE__ ) . '/newsletter.php' );
        $this->newsletter = new Zero_Newsletter();

        return true;

    }

}

# Instantiate the main Plugin class and assign it a variable for reference elsewhere. This creates your plugin object.
$zero_plugin = new Zero_Plugin();

//print_r( $zero_plugin );

?>

ファイルnewsletter.phpがロードされ、クラスZero_Newsletterがインスタンス化されました。

Zero_Newsletterクラスが行うことに注意してください。その責任は、Newsletter Widgetファイル(newsletter-widget.php)をロードし、それをインスタンス化してwidgetのプロパティを設定することです。

./wp-content/plugins/zero/newsletter.phpの内容:

<?php

/**
 * Class Zero_Newsletter
 *
 * Tell WordPress that your plugin has a widget.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 */
class Zero_Newsletter {

    /**
     * @var null
     */
    public $widget = null;

    /**
     * Zero_Newsletter constructor.
     *
     * Make sure you have your widget with you, while you stand in line to apply for widget registration with WordPress.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     */
    public function __construct() {

        $this->load_newsletter_widget();

        add_action( 'widgets_init', array( $this, 'register_widget' ) );

    }

    /**
     * Load the widget file, then instantiate the widget class, and assign it a property of this class.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     * @return bool
     *
     */
    public function load_newsletter_widget() {

        require_once( plugin_dir_path( __FILE__ ) . '/newsletter-widget.php' );
        $this->widget = new Zero_Newsletter_Widget();

        return true;

    }

    /**
     * Tell WordPress about your Widget.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     * @return bool
     *
     */
    public function register_widget() {

        if ( ! $this->widget ) {
            return false;
        }

        register_widget( 'Zero_Newsletter_Widget' );

        return true;

    }

}

?>

ファイルnewsletter-widget.phpがロードされ、クラスZero_Newsletter_Widgetがインスタンス化されました。あなたは今あなたのウィジェットをリストするためにWordPressに申し込まなければなりません。登録アプリケーションに関する適切な情報をWordPressに入力した場合、WordPressはそのプラグインのウィジェットをそのエコシステムに登録するようにアプリケーションを承認します。

./wp-content/plugins/zero/newsletter-widget.phpの内容:

<?php

/**
 * Class Zero_Newsletter_Widget
 *
 * Tell WordPress about your Plugin's widget.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 */
class Zero_Newsletter_Widget extends WP_Widget {

    /**
     * Zero_Newsletter_Widget constructor.
     *
     * Registration application with WordPress. WordPress will either accept or reject your registration application
     * based on the contents of your constructor.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     */
    public function __construct() {

        parent::__construct(
            'zero_newsletter',
            'Newsletter',
            array( 'description' => 'Un formulaire d\'inscription à la newsletter.' )
        );

    }

    /**
     * Output the contents of the widget.
     *
     * @author Michael Ecklund
     * @author_url https://www.michaelbrentecklund.com
     *
     * @param array $args
     * @param array $instance
     *
     * @return bool|void
     */
    public function widget( $args, $instance ) {

        echo 'widget newsletter';

        return true;

    }

}

?>

これはあなたのプラグインオブジェクトの生成された構造です:

Zero_Plugin Object
(
    [newsletter] => Zero_Newsletter Object
        (
            [widget] => Zero_Newsletter_Widget Object
                (
                    [id_base] => zero_newsletter
                    [name] => Newsletter
                    [option_name] => widget_zero_newsletter
                    [alt_option_name] => 
                    [widget_options] => Array
                        (
                            [classname] => widget_zero_newsletter
                            [customize_selective_refresh] => 
                            [description] => Un formulaire d'inscription à la newsletter.
                        )

                    [control_options] => Array
                        (
                            [id_base] => zero_newsletter
                        )

                    [number] => 
                    [id] => 
                    [updated] => 
                )

        )

)

個人的には、私は純粋なOOPプラグインのファンではありません。 OOPを使用するのは良い考えだと思いますが、適切な場合に限ります。あなたは最終的にこの方法でそれをしている矛盾と潜在的な障害にぶつかるでしょう。

手続き型コードとOOPを混在させるべきです。必要なときだけオブジェクトを作成してください。すべてがオブジェクトの中のオブジェクトの中のオブジェクトである必要はありません。

私はこのコードをテストしました、そしてそれは働きます。 OOPとWordPress開発について少し学んだことを願っています。

5
Michael Ecklund