web-dev-qa-db-ja.com

インスタンスが1つだけのウィジェットを定義する方法

どのインスタンスのどのインスタンスを使用できるのか。

1
rsman

簡単な方法は、最初のウィジェット実行時に何らかのグローバル変数を設定し、それをチェックすることです。設定されている場合は何も出力しません。

適切な方法はおそらくあなたがそれをサイドバーに追加したときにインターフェースを使ってウィジェットを利用可能から削除することでしょうが、それは私のリーグからの道です。

2
Rarst

@ 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' )
);
3
mfields

以前、私はチュートリアルへのリンクを提供していました、以下は完全に機能する例です。 @mfieldsの例は問題なく動作しますが、mineには単にオプションのフィールドが存在するだけです。

/* 
 * 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'));
    }
}
0
brasofilo

あなたは古い方法で一度活性化することができるウィジェットを作成することができます:

<?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に使用できることに留意してください。

0
Philip