英语不是我的母语,但我会尽力向您描述我的问题。
我正致力于WooCommerce
的插件工作,我不认为这是真的有用但无论如何...
我已设置自定义帖子类型,并为该帖子类型分配了custom-taxonomy
。
对于每个自定义分类术语,我在产品类型上创建metabox
。
每个metabox都是唯一的,因为我通过了term-slug。
function add_post_meta_boxes() {
$args = array(
'type' => 'product',
'taxonomy' => 'picto_group',
'orderby' => 'term_group',
'order' => 'ASC'
);
$groups = get_categories($args);
foreach($groups as $group) {
//
$slug = $group->slug;
$name = $group->name;
$count = $group->category_count;
$desc = $group->category_description;
$catid = $group->cat_ID;
add_meta_box(
'i3_picto_'.$slug, // Unique ID
$name.' - '.$count, // Title
'i3_picto_meta_box', // Callback function
'product', // Admin page (or post type)
'normal', // Context
'low', // Priority
array($slug, $catid, $desc)// Arguments to pass into the callback function
);
}// End foreach
}
此metabox
填充了所有具有自定义字词的帖子。
function i3_picto_meta_box( $object, $box ) {
$slug = $box['args'][0];
$catid = $box['args'][1];
$desc = $box['args'][2];
?>
<p>
<?php
$args = array(
'post_type' => 'product_picto', // Post-Type name
'numberposts' => -1,
'tax_query' => array(
array(
'taxonomy' => 'picto_group', // Taxonomy name
'field' => 'id',
'terms' => $catid // Term ID
)
)
);
$pictograms = get_posts( $args );
foreach ( $pictograms as $pictogram ) :
setup_postdata( $pictogram );
$pslug = $pictogram->post_name;
$checked = get_post_meta($pictogram->ID, 'cb-one[cb-'.$slug.'_'.$pslug.']', true);
?>
<div class="group-<?php echo $slug; ?>-<?php echo $pslug; ?>">
<label for="cb-<?php echo $slug; ?>_<?php echo $pslug; ?>">
<?php echo get_the_post_thumbnail( $pictogram->ID, 'thumbnail' ); ?>
<?php the_title(); ?>
<?php the_content(); ?>
<input type="checkbox" name="cb-one[cb-<?php $slug; ?>_<?php $pslug;?>']" id="cb-<?php echo $slug; ?>_<?php echo $pslug; ?>" <?php if( $checked == true ) { ?>checked="checked"<?php } ?> />
</label>
</div>
<?php
endforeach;
wp_reset_postdata();
?>
</p>
<?php }
所有帖子都会显示标题,缩略图和内容。
我还会在每个帖子中显示一个复选框。 因此,当我编辑某些产品时,我可以查看某些类别的帖子。 最后这些帖子也应该显示在前端。
现在我遇到了如何为每个复选框保存状态的问题。 因为我的所有元数据都是自动生成的,正如您所看到的,我的checkbox-field也有一个自动生成的名称“term-slug”+“post-slug”。
如何将生成的复选框字段名称传递给我的save_post function
?
我想我以错误的方式命名了我的复选框字段,我还认为我需要在保存函数中的update_post_meta上运行foreach-loop?
也许我在这里想的太复杂了。
也许有人可以理解这一点并为我提供一些有用的信息。
谢谢, 沫
更新
嘿伙计们,
所以今天我工作并更新了我的代码。我现在可以保存metaboxes
和checked
州。但事情还不是很正确。
我希望我可以编辑我的问题而不是评论。
新的checkbox
代码如下所示:
<input type="checkbox" name="cb-one[]" id="cb-<?php echo $slug; ?>_<?php echo $pslug; ?>" value="<?php echo $pid; ?>" <?php checked( in_array( $pid, $pictoarray ) ); ?> />
保存metabox
的功能如下:
function i3_save_post_class_meta( $post_ID ) {
global $post;
if(isset( $_POST['cb-one'] ))
{
$custom = $_POST['cb-one'];
$old_meta = get_post_meta($post->ID, '_cb-one');
// Update post meta
if(!empty($old_meta)){
update_post_meta($post->ID, '_cb-one', $custom );
} else {
add_post_meta($post->ID, '_cb-one', $custom );
}
}
}
为了能够获得单个复选框的checked=checked
状态,我将此代码添加到i3_picto_meta_box
函数的顶部:
global $post;
$pictolist = get_post_meta( $post->ID, '_cb-one');
if (!empty($pictolist[0])) {
$pictoarray = $pictolist[0]; // Get the right array
}
这里我将元数据作为数组获取,并在输入元素上检查该元素的值是否也在该数组中。
通过这些更新,我现在可以在我的帖子/产品中选择多个复选框。所选帖子的ID已保存,我也可以在前端检索它们。
我正在使用复选框,因为我希望以后能够取消选中它们。
所以我尝试了这个,我选择了多个复选框并保存了帖子。之后,我取消选中每个复选框并再次保存。
不幸的是,所有复选框都保持检查状态!
我只取消选中一个盒子并保存,一切都很好。 我继续这个逐一发现,每次最后一个复选框都保持检查状态。
我可以取消选中除一个之外的所有方框。 保存帖子后,我们仍然会检查一个复选框。
我希望有人可以帮我解决这个问题。
谢谢,莫
答案 0 :(得分:0)
几乎总是在提出问题之后,我找到了解决方案;)
我做到了。问题只在于我的保存功能。该函数设置为在未选中复选框时添加一些元数据。
所以我把它改成了这个:
/**
* Saving the meta-boxes
**/
function i3_save_post_class_meta( $post_ID ) {
global $post;
if(isset( $_POST['cb-one']))
{
$custom = $_POST['cb-one'];
$old_meta = get_post_meta($post->ID, '_cb-one');
// Update post meta
//if(!empty($old_meta)){
update_post_meta($post->ID, '_cb-one', $custom );
//}
}else{
delete_post_meta($post->ID, '_cb-one', $custom );
}
}
希望这也可以帮助其他人。