如何定义只有一个实例的Widget?

时间:2010-09-15 作者:rsman

一个只有一个实例的小部件如何使用?

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

简单的方法是在第一次运行小部件时设置一些全局变量并检查它。如果已设置,则不输出任何内容或信息性消息。

正确的方法可能是使用界面,并在您将小部件添加到侧栏时将其从可用的小部件中删除,但这是我力所不及的。

SO网友:mfields

我根据@Philip的答案整理了以下代码。似乎对我有用。欢迎任何建议!

function mfields_test_single_instance_widget( $args ) {
    $args = wp_parse_args( (array) $args, array(
        \'before_widget\' => \'<div>\',
        \'after_widget\'  => \'</div>\',
        \'before_title\'  => \'<h2>\',
        \'after_title\'   => \'</h2>\',
    ) );
    print $args[\'before_title\'] . esc_html( $args[\'widget_name\'] ) . $args[\'after_title\'];
    print $args[\'before_widget\'] . \'<p>THERE CAN BE ONLY ONE!!!</p>\' . $args[\'after_widget\'];
}
wp_register_sidebar_widget(
    \'mfields-test-single-instance-widget\',
    \'Single Instance Widget\',
    \'mfields_test_single_instance_widget\',
    array( \'classname\' => \'mfields-test-single-instance-widget\' )
);

SO网友:Philip

您可以创建可以使用旧方法激活一次的小部件:

<?php
// Custom Widget
function widget_artdev_custom() { ?>

// YOUR CODE-FUNCTIONS HERE

<?php }
if ( function_exists(\'register_sidebar_widget\') )
register_sidebar_widget(__(\'Custom Widget\',\'artdev\'), \'widget_artdev_custom\');
?>
请记住,此代码可用于>2.8及更早版本的wordpress。

SO网友:brasofilo

之前,我提供了一个指向教程的链接,下面是一个完整的工作示例@mfields示例运行得很好,我的示例只提供了选项字段。

/* 
 * Single Instance Widget with Options
 */

add_action("widgets_init", array(\'Single_instance_widget\', \'register\'));
register_activation_hook(__FILE__, array(\'Single_instance_widget\', \'activate\'));
register_deactivation_hook(__FILE__, array(\'Single_instance_widget\', \'deactivate\'));

class Single_instance_widget
{
    function activate()
    {
        $data = array(
            \'option1\' => \'Default value\',
            \'option2\' => 55
        );

        if (!get_option(\'wpse_1828_widget\')) 
        {
            add_option(\'wpse_1828_widget\', $data);
        } 
        else 
        {
            update_option(\'wpse_1828_widget\', $data);
        }
    }

    function deactivate()
    {
        delete_option(\'wpse_1828_widget\');
    }

    function control()
    {
        $data = get_option(\'wpse_1828_widget\');
        echo <<<HTML
    <p><label>Option 1<input name="wpse_1828_widget_option1"
                             type="text" value="{$data[\'option1\']}"/></label></p>
    <p><label>Option 2<input name="wpse_1828_widget_option2"
                             type="text" value="{$data[\'option2\']}"/></label></p>
HTML;

        if (isset($_POST[\'wpse_1828_widget_option1\'])) 
        {
            $data[\'option1\'] = attribute_escape($_POST[\'wpse_1828_widget_option1\']);
            $data[\'option2\'] = attribute_escape($_POST[\'wpse_1828_widget_option2\']);
            update_option(\'wpse_1828_widget\', $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(\'wpse_1828_widget_id\', \'Single Instance Widget\', array(\'Single_instance_widget\', \'widget\'));
        wp_register_widget_control(\'wpse_1828_widget_id\', \'Single Instance Widget\', array(\'Single_instance_widget\', \'control\'));
    }
}

结束

相关推荐