使用OOP构建小部件的正确方法是什么

时间:2013-01-13 作者:Yoav Kadosh

我正在开发一个简单的搜索表单小部件,它具有内置的自动完成功能(您可以下载当前版本here). 插件正在运行,但我目前正在使用OOP重写所有代码。我遇到的一个问题是,Wordpress小部件已经是WP\\U小部件类的一部分。我可以将代码分为两类。第一个加载所有脚本和css,并初始化小部件。以下是代码大纲:

class wdSearchForm {

        public function __construct() {
            // Action hook to load widget
            // Register and enqueue styles
            // Register and enqueue scripts
        }

        // register widget in WordPress so that it is available under the widgets section
        public function wd_searchform() {
            register_widget( \'wd_searchform\' );
        }
}
下面是widget类的概要:

class wd_searchform extends WP_Widget {

    // Constructor
    function wd_searchform() {

    }

    // The widget itself
    function widget( $args, $instance ) {
        // The widget code
    }

    //Update the widget 
    function update( $new_instance, $old_instance ) {
        // Update code
    }

    function form( $instance ) {
        //Set up widget settings.
    }
}
我想将两者结合起来,以便使用wp_localize_script 并使用小部件选项加载脚本。我该怎么做?欢迎任何建议,即使你会告诉我我完全错了方向。。。

2 个回复
最合适的回答,由SO网友:Steve 整理而成

您可以简单地将init代码放在类的构造函数中。例如:

class myWidget extends WP_Widget{

    function myWidget(){
       // Init code here
    }

    function widget( $args, $instance ) {
       // The widget code
       wp_enqueue_script(...);
       wp_enqueue_style(...);

   }

   // Over methods...

}

register_widget(\'myWidget\');
我的首选是将排队调用放在shortcode处理函数中,以避免与加载给定页面上未使用的JavaScript和样式表相关的开销和潜在冲突。

SO网友:Ralf912

您的代码是PHP4样式。不应再使用PHP4样式的代码。仅仅在类构造中放置一些函数并不是面向对象的。如果您想编写可重用代码,请将代码分开。

例如:

class Widget_Setup
{
    public $widget_class  = \'\';
    public $admin_styles  = array();
    public $admin_scripts = array();
    public $front_styles  = array();
    public $front_scripts = array();

    public $script_defaults = array(
        \'handle\'    => \'\',
        \'src\'       => \'\',
        \'deps\'      => array(),
        \'version\'   => false,
        \'in_footer\' => false
    );

    public $style_defaults = array(
        \'handle\'   => \'\',
        \'src\'      => \'\',
        \'deps\'     => array(),
        \'version\'  => false,
        \'media\'    => \'all\'
    );

    public function __construct( $widget_class = \'\', $admin_styles = array(), $admin_scripts = array(), $front_styles = array(), $front_scripts = array() ) {

        $this->widget_class  = $widget_class;
        $this->admin_styles  = $admin_styles;
        $this->admin_scripts = $admin_scripts;
        $this->front_styles  = $front_styles;
        $this->front_scripts = $front_scripts;

        add_action( \'admin_print_styles\',    array( $this, \'add_styles\' ) );
        add_action( \'admin_enqueue_scripts\', array( $this, \'add_scripts\' ) );
        add_action( \'wp_enqueue_scripts\',    array( $this, \'add_styles\' ) );
        add_action( \'wp_enqueue_scripts\',    array( $this, \'add_scripts\' ) );

        if( ! empty( $this->widget_class ) )
            add_action( \'widgets_init\', array( $this, \'register_widget\' ) );

    }

    public function register_widget() {

        register_widget( $this->widget_class );

        return true;

    }

    public function add_styles() {

        $styles = ( is_admin() ) ?
            $this->admin_styles : $this->front_styles;

        if( empty( $styles ) )
            return false;

        foreach( $styles as $style ) {

            $style = wp_parse_args( $style, $this->style_defaults );

            wp_enqueue_style(
                $style[\'handle\'],
                $style[\'src\'],
                $style[\'deps\'],
                $style[\'version\'],
                $style[\'media\']
            );

        }

        return true;
    }

    public function add_scripts() {

        $scripts = ( is_admin() ) ?
            $this->admin_scripts : $this->front_scripts;

        if( empty( $scripts ) )
            return false;

        foreach( $scripts as $script ) {

            $script = wp_parse_args( $script, $this->script_defaults );

            wp_enqueue_script(
                $script[\'handle\'],
                $script[\'src\'],
                $script[\'deps\'],
                $script[\'version\'],
                $script[\'media\']
            );

        }

        return true;
    }

}
这个类可以对每个小部件重用。OOP背后的思想是通过编写带有附加函数的数据构造来重用代码。不使用类构造,因为有人说这是一种好的风格。

该类可以这样使用:

class MyAwesomeWidget extends WP_Widget
{

    const TEXTDOMAIN = \'widget_textdomain\';

    public function __construct() {

        parent::__construct(

            \'widget-name-id\',
            __( \'Widget Name\', self::TEXTDOMAIN ),
            array(
                \'classname\'   =>    __CLASS__,
                \'description\' =>    __( \'Short description.\', self::TEXTDOMAIN )
            )
        );

        $admin_style = array(
            array( \'handle\' => \'somehandle\', \'src\' => \'path/to/source\' ),
            array( \'handle\' => \'someotherhandle\', \'src\' => \'path/to/source\' ),
        );

        $admin_scripts = array(
            array( \'handle\' => \'scrpthandle\', \'src\' => \'path/to/source\', \'deps\' => array( \'jquery\') ),
        );

        $front_styles = array(
            array( \'handle\' => \'frontstyle\', \'src\' => \'path/to/src\' ),
        );

        new Widget_Setup( __CLASS__, $admin_style, $admin_scripts, $front_styles );
    }

    public function widget( $instance, $args ) {}

    public function update( $new_instance, $old_instance ) {}

    public function form( $instance ) {}

}

结束

相关推荐

找不到单一类型.php文件的页面

我已经创建了自定义帖子类型“event”,以在名为single event的单个页面中显示。php文件,但它提供了404错误。我如何解决这个问题flush\\u rewrite\\u rules();请提供一些想法。。。。。。。function custom_event() { $labels = array( \'name\' => _x(\'Event\', \'post type general name\'), \'singular_name\' =&g