首页 文章

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

提问于
浏览
1

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

我正在为 WooCommerce 插件工作,我不认为这是真的有关但无论如何......

我已经设置了一个自定义后期类型,并为该post-type分配了一个 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 }

所有帖子都显示 Headers ,缩略图和内容 .

我还会在每个帖子中显示一个复选框 . 因此,当我编辑某些产品时,我可以查看某些类别的帖子 . 最后这些帖子也应该显示在前端 .


现在我在如何为每个复选框保存状态方面遇到了大麻烦 . 因为我的所有元变量都是自动生成的,正如您所看到的,我的checkbox-field也有一个自动生成的名称“term-slug”“post-slug” .

如何将生成的复选框字段名称传递给 save_post function

我想我以错误的方式命名我的复选框字段,我还认为我需要在保存函数中的update_post_meta上运行foreach-loop?

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

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

谢谢,莫


UPDATE

大家好,

所以今天我工作并更新了我的代码 . 我现在可以保存我的 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已保存,我也可以在前端检索它们 .

我使用复选框因为我希望将来能够取消选中它们 .

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

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

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

除了一个,我可以取消选中所有方框 . 保存帖子后,我们仍会检查一个复选框 .

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

谢谢,莫

1 回答

  • 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  );
        }
    
    }
    

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

相关问题