it-swarm-pt.tech

Como um widget com apenas uma instância pode ser definido?

Como pode um widget qual dos quais apenas uma instância pode ser usada?

1
rsman

A maneira simples seria definir algumas variáveis ​​globais na primeira execução do widget e verificar isso. Não envie nada ou mensagem informativa, se já estiver definido.

Maneira adequada seria provavelmente trabalhar com interface e remover widget de disponível quando você adicioná-lo à barra lateral, mas isso é muito fora da minha liga.

2
Rarst

Eu coloquei o seguinte código com base na resposta do @ Philip. Parece funcionar para mim. Todas as sugestões são bem vindas!

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

Anteriormente, eu tinha fornecido um link para um tutorial, o seguinte é um exemplo completo de trabalho. @mfields exemplo funciona muito bem, o meu simplesmente tem os campos de opções presentes.

/* 
 * 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

você pode criar widgets que podem ser ativados uma vez com o método antigo:

<?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');
?>

tenha em mente que este código pode ser usado para> 2.8 e versões mais antigas do wordpress.

0
Philip