我正在尝试创建一个小部件,使用户可以选择要显示的类别。 以下是我创建的代码段,但无法保存复选框状态的更改。只有两个值:标题和所选类别列表。
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变量中传递数组。
提前致谢。
答案 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')";