¿Cómo se puede definir un widget con solo una instancia?

1

¿Cómo se puede usar un widget del cual solo se puede usar una instancia?

    
pregunta rsman 15.09.2010 - 04:08

4 respuestas

2

Una forma sencilla sería establecer una variable global en la primera ejecución del widget y verificarla. No muestra nada o mensaje informativo si ya está configurado.

Probablemente, la forma correcta sería trabajar con la interfaz y eliminar el widget que está disponible cuando lo agregues a la barra lateral, pero eso está fuera de mi liga.

    
respondido por el Rarst 15.09.2010 - 08:17
3

Reuní el siguiente código basado en la respuesta de @Philip. Parece funcionar para mi. Cualquier sugerencia es bienvenida!

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' )
);
    
respondido por el mfields 20.03.2011 - 15:33
0

puedes crear widgets que pueden activarse una vez con el método anterior:

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

tenga en cuenta que este código se puede usar para > 2.8 y versiones anteriores de wordpress.

    
respondido por el Philip 19.12.2010 - 12:38
0
  

Anteriormente, había proporcionado un enlace a un tutorial, el siguiente es un ejemplo completo de trabajo. El ejemplo de @mfields funciona bien, el mío simplemente tiene los campos de opciones 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'));
    }
}
    
respondido por el brasofilo 23.03.2012 - 06:34

Lea otras preguntas en las etiquetas