具有相同输出回调的多个单一使用小部件

时间:2018-02-02 作者:That Brazilian Guy

我有这样一个场景,需要提供各种单一用途的小部件。

它们都以相同的方式显示,所以我觉得每个小部件不需要不同的显示功能。但是,如果我对所有wp_register_sidebar_widget 实例,只有最后一个实例处于活动状态。

我被迫拥有多个相同的函数,只是名称不同。如何改进它?

add_action( \'widgets_init\', \'register_single_use_widgets\' );
function register_single_use_widgets() {

  $id = \'first\';
  $name = \'First Widget\';
  $widget_ops = array( \'description\' => \'This is the first widget.\' );
  wp_register_sidebar_widget( $id, $name, \'single_widget_display\', $widget_ops );

  $id = \'second\';
  $name = \'Second Widget\';
  $widget_ops = array( \'description\' => \'This is the second widget.\' );
  wp_register_sidebar_widget( $id, $name, \'single_widget_display2\', $widget_ops );

  $id = \'third\';
  $name = \'Third Widget\';
  $widget_ops = array( \'description\' => \'This is the third widget.\' );
  wp_register_sidebar_widget( $id, $name, \'single_widget_display3\', $widget_ops );

}

function single_widget_display( $args ) {
  $name = $args[\'widget_name\'];
  echo "<p> $name </p>";
}

function single_widget_display2( $args ) {
  $name = $args[\'widget_name\'];
  echo "<p> $name </p>";
}

function single_widget_display3( $args ) {
  $name = $args[\'widget_name\'];
  echo "<p> $name </p>";
}

1 个回复
SO网友:Jacob Peattie

看来wp_register_sidebar_widget 是小部件早期实现中非常过时的函数。显然,在当时,小部件只能使用一次,输出回调名称似乎是小部件唯一的原因,尽管存在ID。这些小部件的一次性使用性质似乎不是故意的。

考虑到它的年龄,我建议使用基于register_widget(). 要用相同的输出注册3个小部件,您需要为小部件创建一个类,并添加一些额外的内容,然后注册3个不同的实例。

function wpse_292985_widget_display( $args ) {
    echo \'<p>\' . $args[\'widget_name\'] . \'</p>\';
}

class WPSE_292985_Widget extends WP_Widget {
    function __construct( $id, $name, $widget_ops ) {
        parent::__construct( $id, $name, $widget_ops );
    }

    function widget( $args, $instance ) {
        wpse_292985_widget_display( $args );
    }
}

function wpse_292985_register_widgets() {
    register_widget( new WPSE_292985_Widget( 
        \'first\', 
        \'First Widget\', 
        [\'description\' => \'This is the first widget.\']
    ) );

    register_widget( new WPSE_292985_Widget( 
        \'second\', 
        \'Second Widget\', 
        [\'description\' => \'This is the second widget.\']
    ) );

    register_widget( new WPSE_292985_Widget( 
        \'third\', 
        \'Third Widget\', 
        [\'description\' => \'This is the third widget.\']
    ) );
}
add_action( \'widgets_init\', \'wpse_292985_register_widgets\' );
这里发生的第一件事是定义我们希望小部件输出的函数。它接受$args 作为我们将在widget类中传递的参数。

下一位是小部件的类。这个类只是通用WordPress小部件类的一个副本,但我们正在设置widget() 方法输出函数。

然后,通过创建widget类的新实例并将其传递到register_widget().

结束

相关推荐

Using add_filter() in Widgets

只需查询引用add_filter() 作用您可以在WordPress小部件类中使用此函数吗。Example我有一个带有动态创建代码的小部件,我想将其传递给插件中创建的另一个函数。这能实现吗?<?php /** * Display the actual Widget * * @param Array $args * @param Array $instance */ public function widget($args, $inst