Wordpress小部件中的复选框数组?

时间:2013-02-14 07:58:18

标签: wordpress

我正在尝试创建一个小部件,使用户可以选择要显示的类别。 以下是我创建的代码段,但无法保存复选框状态的更改。只有两个值:标题和所选类别列表。

function form($instance) {
    $instance = (array)$instance;
    if( empty($instance['title']) ) $instance['title'] = 'Category';
    $selected_categories = (array)$instance['category'];
    var_dump($selected_categories); 
    ....
    $categories = get_categories( array('exclude'=> 1) );
    foreach($categories as $category) : ?>
    <div>
        <input type="checkbox" name="<?php echo $this->get_field_name('category'); ?>"
            value="<?php echo $category->cat_ID; ?>"
            <?php echo $category->cat_name; ?>
    </div>
    <?php endforeach; ?>
}

function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance['title'] = strip_tags($new_instance['title']);
    $instance['category'] = $new_instance['category'];

    return $instance;
}

我通过var_dump($ selected_categories)观察变化。该值始终为array(size = 0),忽略了我检查的复选框数。

我不知道如何在$ instance变量中传递数组。

提前致谢。

3 个答案:

答案 0 :(得分:0)

如果没有设置,你是否有一个验证函数填充数组中的值?这是小部件的»update«方法。也许你应该补充:

'<input name="..." value="..." id="'.$this->get_field_id( 'category' ).'" />';

到你的输入元素。

答案 1 :(得分:0)

我在这个问题上花了很多时间。在线搜索这个主题并不令人满意。我想了解Widget如何扩展WP_Widget对象的工作原理。像原始帖子一样,我也想让我的管理员从所有帖子类别的动态检查列表中进行选择。在我的网站上,我正在使用它作为宣传片,我希望有很多这种小狗的实例。强大的实例存储系统对我来说至关重要。

一些令我烦恼的愚蠢问题。 1)怎么了时髦的标签= ....类别名称/标签我在网上每个例子上看到的东西。 (注意'label'被左/右符号包围..这里不能这样做..)是必需的,还是只是复制以前做过的人(在WordPress源代码中的文件defaults-widgets.php中) ? Ans:完全浪费时间。少即是多,代码正确。

2)我真的很想了解系统如何保存用户选择的机制。在后端页面上似乎没有明显的编码来捕获选择。我在这里花了很长时间进行搜索,包括尝试通过调试器上的代码,并且结果很糟糕。我花了很多时间用var_dump($ instance)来理解结果。系统有效,但我真的不明白为什么。

我使这个系统工作的逻辑是创建一个复选框变量,让它工作。下一步是创建一个复选框变量数组,但只使用其中一个,并使其工作。最后利用整个复选框变量数组。成功。

代码摘录如下:

/*Saves the settings. */
function update( $new_instance, $old_instance ){

    $args = array(
        //your selections here.
    ); 
    $categories = get_categories( $args );   // returns an array of category objects
    $arrlength=count($categories);

    for($x=0;$x<$arrlength;$x++){
        $tempArray[$categories[$x]->slug] = '';  
    }
    $instance = $old_instance;       
    $new_instance = wp_parse_args( (array) $new_instance, $tempArray );

    for($x=0;$x<$arrlength;$x++){
        $instance[$categories[$x]->slug] = $new_instance[$categories[$x]->slug] ? 1 : 0;
    }
    return $instance;
}

/*Creates the form for the widget in the admin back-end. */
function form( $instance ){
     echo '<p>Choose your categories of interest. Multiple selections are fine.</p> ';

    $args = array(
         //your selections here.  Use same args as update function, duh.
    ); 
    $categories = get_categories( $args );   // returns an array of category objects
    $arrlength=count($categories);

    for($x=0;$x<$arrlength;$x++){
        $tempArray[$this->get_field_id($categories[$x]->slug)] = '';
    }
    $instance = wp_parse_args( (array) $instance, $tempArray );

    for($x=0;$x<$arrlength;$x++){
        $tempCheckFlag[$categories[$x]->slug] = $instance[$categories[$x]->slug]  ? 'checked="checked"' : '';   
        // could also use 'checked()' function    
        // Yup, this could be combined with the for loop below, 
        // listed here seperately to enhance understanding of what's going on.
    }

    for($x=0;$x<$arrlength;$x++)
    {
        echo '<p><input class ="checkbox" type="checkbox" value="1" id="'.$this->get_field_id($categories[$x]->slug).'" name="'.$this->get_field_name($categories[$x]->slug).'"'.$tempCheckFlag[$categories[$x]->slug].'>'.$categories[$x]->name.'  (Category # '.$categories[$x]->term_id.' )</p>';  
    }
}

当我需要在我的widget函数中使用选择时,我从$ instance变量中检索管理员的选择。

/* Displays the Widget in the front-end */
function widget( $args, $instance ){
    //.... 

    foreach($instance as $key=>$value)
    {
        if ($value){
            $category_array[]=$key;
        }
    }
 // Now I have a simple array of just those categories that had a check mark... 

答案 2 :(得分:0)

这是第二个使用复选框数组的解决方案。 我在我的小部件recently updated posts widget的新版本1.8中使用复选框数组解决了这个问题。 我使用第二种形式的foreach

foreach (array_expression as $key => $value).

$ key 允许为每个复选框获取唯一ID 。 这里$ id是foreach本身增加的数字。

function form($instance) {
$term_taxonomy_id = (isset($instance['term_taxonomy_id']) ? array_map('absint', $instance['term_taxonomy_id']) : array("0"));
<?php       
    $categ = get_categories();
    foreach($categ as $id => $item) :  
?>
<br/>
<input  type="checkbox"
    id="<?php echo $this->get_field_id('term_taxonomy_id') . $id; ?>" 
    name="<?php echo $this->get_field_name('term_taxonomy_id'); ?>[]" 
    <?php   if (isset($item->term_taxonomy_id)) {
                if (in_array($item->term_taxonomy_id,$term_taxonomy_id)) 
                    echo 'checked'; 
                };      
            ?>  
    value="<?php echo $item->term_taxonomy_id; ?>" />
<label for="<?php echo $this->get_field_id('term_taxonomy_id') . $id; ?>" >
<?php echo $item->name ?>
</label>
    <?php endforeach; ?>

我存储了 term_taxonomy_id 而不是 cat_ID ,但是您可以存储 cat_ID ,它也能正常运行。

数组数据由php函数array_map()清理。更新函数为:

 function update($new_instance, $old_instance) {
// Par défaut, aucune catégorie n'est exclue
    $instance['term_taxonomy_id'] =  (isset($new_instance['term_taxonomy_id']) ? array_map( 'absint', $new_instance['term_taxonomy_id']) : array('0'));

对于它们在MySQL查询中的使用,我将其分解为一组值:

// écriture de la liste des objects sélectionnées en langage MySQL
    if (isset($instance['term_taxonomy_id'])) 
        $selected_object = "('".implode(array_map( 'absint',$instance['term_taxonomy_id']),"','")."')"; 
    else $selected_object = "('0')";