it-swarm.dev

Jak lze definovat widget s pouze jednou instancí?

Jak může být widget, z něhož lze použít pouze jednu instanci?

1
rsman

Jednoduchým způsobem by bylo nastavit nějakou globální proměnnou na prvním spuštění widgetu a zkontrolovat ji. Není-li již nastavena žádná nebo informační zpráva.

Správným způsobem by pravděpodobně bylo pracovat s rozhraním a odstranit widget z dostupných, když ho přidáte do postranního panelu, ale to je cesta z mé ligy.

2
Rarst

Dal jsem dohromady následující kód založený na @ Philipově odpovědi. Zdá se, že pracuje pro mě. Jakékoliv návrhy jsou vítány!

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

Dříve jsem poskytl odkaz na tutoriál, následující je úplný pracovní příklad. @mfields příklad funguje v pořádku, moje prostě má pole možností.

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

můžete vytvořit widgety, které lze jednou aktivovat pomocí staré metody:

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

mějte na paměti, že tento kód může být použit pro> 2.8 a starší verze wordpressu.

0
Philip