通过register_widget动作钩

时间:2016-09-20 05:56:18

标签: wordpress class widget extends

使用register_widget()函数时,是否可以将其他参数传递到自定义Wordpress小部件中? register_widget只排除一个参数 - 目标类名。

add_action( 'widgets_init', function() {
    register_widget("ID_Projects_Widget"); 
} );

class ID_Projects_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct([...])
    }
}

相当广泛的搜索日期已经空白......

https://wordpress.org/ideas/topic/passing-arguments-to-widget

https://wordpress.org/ideas/topic/allow-ability-to-pass-parameters-when-registering-widgets

问题背后的逻辑?

我们希望传入一个包含post_type名称,ACF'选项'页面ID等等的数组,这些数据已在之前的类中注册...该小部件仅用于提供用户选择......

我们真的想避免使用越来越多的GLOBALS - 如果可能的话......

我们的逻辑是否倒退?小部件是否在鸡蛋之前?

1 个答案:

答案 0 :(得分:2)

通过创建扩展窗口小部件类的附加扩展,可以将属性发送到已注册的窗口小部件。

/*
 * Standard WP_Widget
 * https://developer.wordpress.org/reference/classes/wp_widget/
 */
class Actual_Widget extends \WP_Widget {

    // WordPress WP_Widget Class 
    public function __construct($args) {

// do stuff with $args

        parent::__construct(
        // extend WP_Widget as per codex
        );
    }

}

/*
 * Args passed to WP_Widget Class __constuctor for processing
 */

class Temp_Widget extends Actual_Widget {

    public function __construct($args) {
        $this -> args = $args;
        parent::__construct( $this -> args );
    }

}

/*
 * Args passed via Action Hook to Temp_Widget Class
 */
add_action( 'widgets_init', function() {

    $args = array( 'chicken', 'fish' ); // Proceedural
    $args = $this -> args; // Or Class Properties

    $widget = new Temp_Widget( $args );
    \register_widget( $widget );
} );