rsman
  • 0
Учитель

Как можно определить виджет только с одним экземпляром?

  • 0

Как можно использовать виджет, из которого можно использовать только один экземпляр?

Share
  1. Вот доказательство концепции одноразового виджета, полученное из этого ответа : github.com/glueckpress/single-use-widget Ограничение: работает только в настройщике, а не на странице администрирования виджета.

    • 0
  2. Простым способом было бы установить некоторую глобальную переменную при первом запуске виджета и проверить ее. Ничего не выводить или информационное сообщение, если оно уже установлено.

    Правильным способом, вероятно, было бы работать с интерфейсом и удалять виджет из списка доступных, когда вы добавляете его на боковую панель, но это далеко не мой уровень.

    • 0
  3. Я составил следующий код на основе ответа @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' )
    );
    
    • 0
  4. вы можете создавать виджеты, которые можно активировать один раз старым методом:

    <?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
  5. Ранее я предоставил ссылку на учебник, ниже приведен полный рабочий пример. Пример @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'));
        }
    }
    
    • 0

Оставить ответ

You must login to add an answer.