WordPress自定义元框,帖子和多个复选框

时间:2015-04-15 14:44:23

标签: php wordpress meta-boxes

英语不是我的母语,但我会尽力向您描述我的问题。

我正致力于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?

也许我在这里想的太复杂了。

也许有人可以理解这一点并为我提供一些有用的信息。

谢谢, 沫


更新

嘿伙计们,

所以今天我工作并更新了我的代码。我现在可以保存metaboxeschecked州。但事情还不是很正确。

我希望我可以编辑我的问题而不是评论。

新的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已保存,我也可以在前端检索它们。

我正在使用复选框,因为我希望以后能够取消选中它们。

所以我尝试了这个,我选择了多个复选框并保存了帖子。之后,我取消选中每个复选框并再次保存。

不幸的是,所有复选框都保持检查状态!

我只取消选中一个盒子并保存,一切都很好。 我继续这个逐一发现,每次最后一个复选框都保持检查状态。

我可以取消选中除一个之外的所有方框。 保存帖子后,我们仍然会检查一个复选框。

我希望有人可以帮我解决这个问题。

谢谢,莫

1 个答案:

答案 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  );
    }

}

希望这也可以帮助其他人。