web-dev-qa-db-ja.com

単一のインスタレーションのみを許可するウィザードを作成する方法

どのようにしてウィジェットの単一のインスタンスのみをWordpressインターフェースを通して追加することを許可するウィジェットを作成するのですか?

ウィジェットのデフォルト動作では、複数のインスタンスを追加できます。

http://codex.wordpress.org/Widgets_API のサンプルコードを使用しています。

私は 同様の質問 を見てきましたが、その答えは古いウィジェットコードを使うことでしたが、可能であればもっと新しいコードを使い続けたいと思います。

Twitter for Wordpress のように、許可されるインスタンス数を正確に制御できるプラグインを見ました。

ありがとう、
マット

3
Matt Sephton

1番目のインスタンスの後に切り替えて中止する

次の例では、最初のインスタンスに設定されていないstatic変数を見つけることができます。ウィジェットが1回目に呼び出された場合は、trueに設定します。 2回目の実行では、実際にはユーザーに何も提供せずに中止し、単に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の記事 からのコード


グローバルウィジェット配列の処理

他の選択肢は、登録されているすべてのウィジェットを含むグローバル配列をチェックすることです。

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で追加されています(nrはインクリメントされます)。 initまたはadmin_initフックで配列を検索し、2番目のインスタンスが見つかった場合は単に設定を解除することができます。おそらく以下のようになります。

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' );
1
kaiser

編集:Doh、ちょうどあなたが古いコードに慣れたくないことを見ました。まあ、私はそれが誰かを助けるために念のためにそれを残します。

WPは 2.8 にマルチウィジェットを追加しました。そこで、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に置き換えました。そうでなければ、これは私がリンクしたチュートリアルからのまっすぐなコピー/貼り付けです。

1
Dave Romsey

これは、この答えから派生した使い捨てウィジェットの概念実証です。

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

制限事項:カスタマイザーでのみ機能し、ウィジェット管理ページでは機能しません。

0
glueckpress