如何创建只允许单个实例的小部件?

时间:2011-10-25 作者:Matt Sephton

如何创建一个只允许通过Wordpress界面添加一个小部件实例的小部件?

小部件的默认行为允许添加多个实例。

我使用的示例代码来自http://codex.wordpress.org/Widgets_API

我看到了similar question 答案是使用旧的小部件代码,但如果可能的话,我想继续使用更现代的代码。

我见过一些插件,比如Twitter for Wordpress 可以精确控制允许的实例数。

谢谢,马特

5 个回复
最合适的回答,由SO网友:Reid Gannah 整理而成

我知道这是一个非常古老的问题,但8年后,除了这个悬而未决的问题(以及其他一些模糊的答案)之外,寻找解决方案并没有产生多少结果。我在这个网站上找不到任何对我有用的东西,所以如果其他人来到这个页面上寻找一种方法,将一个小部件区域限制为特定小部件的单一使用,我在下面提供了对我有用的代码。此解决方案基于article 由Tom McFarlin发布。它利用了jQuery的sortable 函数在每次尝试更新时根据标准检查小部件。我自己做了一些调整,以更好地满足我的需要。

请注意:您需要更换widget_area_id 使用特定小部件区域的您自己的ID以及widget_id 使用实际小部件的您自己的ID。将此代码放入admin.js 文件并在后端将其排队。

jQuery(document).ready(function($){

    $(\'#widget_area_id\').sortable({

        update: function( evt, ui ) {

            // Check each widget in the widget area to verify that it matches the ID of the widget we want there 
            $(this).children(\'.widget\').each(function(){
                var value = $(this).find(\'.widget-inside\').children(\'form\').children(\'.id_base\').val();
                if( value !== \'widget_id\' ){
                    $(this).remove();
                }
            });

            // And if there are more than one widget, remove all but one
            if ( 2 !== $(this).children().length ) {
                $(this).children(\':last\').remove();
            }

        }

    });

});

SO网友:kaiser

在第一个实例后切换并中止在下面的示例中,您可以找到static 未在第一个实例上设置的变量。如果小部件第一次被调用,我们将其设置为true。在第二次运行时,我们中止运行return 没有实际为用户提供任何服务。

class My_Widget extends WP_Widget {
    // You static instance switch
    static $instance;

    function My_Widget() {
            // We set the static class var to true on the first run
            if ( ! $this->instance ) {
                    $this->instance = true;
            } 
            // abort silently for the second instance of the widget
            else {
                    return;
            }
        // widget actual processes
    }
    function form($instance) {
        // outputs the options form on admin
    }
    function update($new_instance, $old_instance) {
        // processes widget options to be saved
    }
    function widget($args, $instance) {
        // outputs the content of the widget
    }
}
register_widget(\'My_Widget\');
代码取自相关Widgets API Codex article

处理全局小部件数组的另一个选项可能是检查包含所有已注册小部件的全局数组:

function wpse32103_show_widgets()
{
    $dump  = \'<pre>\';
    $dump .= var_export( $GLOBALS[\'wp_registered_widgets\'], false );
    $dump .= \'</pre>\';

    return print $dump;
}
add_action( \'shutdown\', \'wpse32103_show_widgets\' );
关联数组的输出包含名称作为键,后面附加-2 (数量增加)。您可以在initadmin_init 如果您找到了第二个实例,则挂起并简单地取消设置。可能如下所示:

function wpse32103_show_widgets()
{
        global $wp_registered_widgets;

        // Go and search for your widgets name with the above written function
        $target = \'FILL IN YOUR FOUND ARRAY KEY HERE. Without -2 (or any other appending number)\';

        // Container for your targeted widget(s)
        $unsets = array();
        foreach ( array_keys( $wp_registered_widgets ) as $widget )
        {
            // remove dashes
            $widget_check = str_replace( \'-\', \'\', $widget );
            // remove numbers
            $widget_check = preg_replace( \'/[^0-9]/\', \'\', $widget );

            // if we match, do it in our container
            if ( $widget_check === $target )
                $unsets[] = $widget;
        }

        // less than one element in the container: abort
        if ( ! count ( $unsets ) > 1 )
            return;

        // preserve first element
        array_shift( array_values( $unsets ) );

        // unset all left instances from the global array
        foreach ( $unsets as $unset )
            unset ( $wp_registered_widgets[ $unset ] );

        return;
}
add_action( \'init\', \'wpse32103_show_widgets\' );

SO网友:Dave Romsey

编辑:Doh,刚刚看到您不想使用旧代码。哦,好吧,我把它留下,以防万一它对别人有帮助。

WP在中添加了多个小部件2.8. 所以我找到了一个tutorial 这涵盖了如何在WP 2.7中制作小部件。代码如下:

add_action("widgets_init", array(\'Widget_name\', \'register\'));
register_activation_hook( __FILE__, array(\'Widget_name\', \'activate\'));
register_deactivation_hook( __FILE__, array(\'Widget_name\', \'deactivate\'));
class Widget_name {
  function activate(){
    $data = array( \'option1\' => \'Default value\' ,\'option2\' => 55);
    if ( ! get_option(\'widget_name\')){
      add_option(\'widget_name\' , $data);
    } else {
      update_option(\'widget_name\' , $data);
    }
  }
  function deactivate(){
    delete_option(\'widget_name\');
  }
    function control(){
        $data = get_option(\'widget_name\');
        ?>
        <p><label>Option 1<input name="widget_name_option1"
    type="text" value="<?php echo $data[\'option1\']; ?>" /></label></p>
        <p><label>Option 2<input name="widget_name_option2"
    type="text" value="<?php echo $data[\'option2\']; ?>" /></label></p>
        <?php
         if (isset($_POST[\'widget_name_option1\'])){
            $data[\'option1\'] = attribute_escape($_POST[\'widget_name_option1\']);
            $data[\'option2\'] = attribute_escape($_POST[\'widget_name_option2\']);
            update_option(\'widget_name\', $data);
        }
    }
  function widget($args){
    echo $args[\'before_widget\'];
    echo $args[\'before_title\'] . \'Your widget title\' . $args[\'after_title\'];
    echo \'I am your widget\';
    echo $args[\'after_widget\'];
  }
  function register(){
        wp_register_sidebar_widget( \'my_widget_id\', \'Widget name\', array(\'Widget_name\', \'widget\'));
    wp_register_widget_control( \'my_widget_id\', \'Widget name\', array(\'Widget_name\', \'control\'));
  }
}
我把电话换成了register_sidebar_widgetregister_widget_control 具有wp_register_sidebar_widgetwp_register_widget_control 分别修复有关使用不推荐使用的函数的警告。否则,这是我链接到的教程的直接复制/粘贴。

SO网友:glueckpress

下面是一个从this answer:

https://github.com/glueckpress/single-use-widget

限制:仅适用于自定义程序,而不适用于小部件管理页面。

SO网友:EarnestoDev

你没有。这太难了,不值得。这就是JS编辑器的工作原理。

BUT: 创建一个没有设置的小部件,并允许在其他页面上进行设置。像这样:

// In your Widget use this form() method
public function form($instance){
    $settings_url = admin_url(\'options-general.php?page=SettingsPage\');
    echo \'<p>\';
        echo \'To setup this <strong>Widget</strong> go to:<br />\';
        echo \'<a href="\', $settings_url, \'" target="_blank">\';
            echo \'<strong>Settings &raquo; Settings Page</strong>\';
        echo \'</a>\';
    echo \'</p>\';
    return \'noform\';
}
使用add\\u options\\u页面创建SettingsPage 第页,共页Widget management. 和使用get_option() 检索的设置Widget Output.

当做

PS: <如果你需要一个完整的例子,请告诉我

结束

相关推荐

WordPress json API分类索引方法

本帖版次如下:wordpress json custom taxonomy problem如何编写使用自定义分类法获取类别的方法,类似于方法:get_category_index 核心json api控制器中?场景:我有一个名为-books的分类法,它有四个类别,我需要通过get\\u taxonomy\\u index输出这些类别。像这样的http://example.com//api/get_taxonomy_index/?dev=1