如何将自定义元函数显示/添加/保存为值数组?

时间:2010-10-30 作者:jaredwilli

我想做的是创建一个自定义post类型、自定义meta框,将其值插入到“colors”或“p\\u clrs”数组中。

我有一个可以运行的jQuery脚本,允许您单击一个链接“添加另一种颜色”,在默认情况下始终显示的输入字段下方添加另一个输入字段(必须显示至少1种颜色的元框)。jQuery添加的输入字段应该将每个添加的值存储为我试图创建的“颜色”数组中的另一个“颜色”。

在现有帖子的newpost页面或edit页面上时,colors元框需要运行foreach循环,以创建存在于“p\\U clrs”变量中的每个“color”的元框。

对于数组和多数组,尤其是foreach循环,我一点也不擅长。我讨厌foreach循环lol。

我已经非常接近于工作,我不想使用分类法来完成所有工作,一旦我在这里创建的数组的每种颜色上都有了这个foreach循环,我就可以处理我需要的任何其他东西了。我只是无法克服我被困在这里的阵痛/困难。

这是我自定义帖子类型的产品类。

这就是我所拥有的帖子信息的所有值(包括我的其他元框,这里没有为它们包含代码)。

class TypeProducts {

    public $prod_meta_fields = array( 
    \'title\', \'description\', \'product_type\', \'post_tag\',
    \'p_sku\', \'p_price\', \'p_discnt_price\', 
    \'p_weight\', \'p_size_w\', \'p_size_h\', 
    \'p_clrs\'
);
这里有一个方法,它也有我的register\\u post\\u type()和register\\u taxonomy()代码,但这并不是真正需要的,所以我把它省略了。调用register\\u ptype和\\u tax()函数后,我为需要添加到init和stuff中的内容添加操作。

public function TypeProducts() {
    add_action( \'admin_init\', array( &$this, \'product_meta_boxes\' ));
    add_action( \'wp_insert_post\', array( &$this, \'wp_insert_post\' ), 10, 2 );
}
此方法用于插入每个post表单字段的所有信息。它也适用于我的所有自定义元数据库,*除了jQuery在单击“添加其他颜色”链接/按钮时添加的其他输入字段。

public function wp_insert_post($post_id, $post = null) {
    if ($post->post_type == \'product\') { // my custom post type is \'product\'
        foreach ($this->prod_meta_fields as $key) { // loops over the $prod_meta_fields
            $value = @$_POST[$key];
            if (empty($value)) {
                delete_post_meta($post_id, $key);
                continue;
            }
            if (!is_array($value)) {
                if (!update_post_meta($post_id, $key, $value)) {
                    add_post_meta($post_id, $key, $value);
                }
            } else {
                delete_post_meta($post_id, $key);
                foreach ($value as $entry) add_post_meta($post_id, $key, $entry);
            }
        }
    }
}
下面是添加我的metabox的方法。不确定是否可以/应该在此范围内执行foreach,在$p\\u clrs值的数组上循环,以添加存在的元框foreach颜色(如果有多个)。否则,应该只显示一个元框(在任何时候都应该至少显示1个元框)。

    function product_meta_boxes() {
    add_meta_box( \'products-price\', \'Product SKU# & Price\', array( &$this, \'prod_price_box\' ), \'product\', \'side\', \'high\' );
    add_meta_box( \'products-colors\', \'Product Colors\', array( &$this, \'prod_colors_box\' ), \'product\', \'normal\', \'high\' );
    }
下面是我输出元框本身的方法,还有jQuery脚本,它添加和删除了其他输入字段,如果添加的框不为空,这些字段在保存帖子时“可能”成为元框。

这是一张我的意思图片,让你了解我在说什么。metabox

当前,第一个输入显示在页面加载上,其中包含存储的任何值(如果有)。单击“添加另一个”链接时,它会添加具有相同值的另一个输入,但在任何输入字段中保存不同值时,它会保存具有值的最后一个输入的值。并且在保存页面时,只在重新加载页面时显示一个输入。我需要显示存在的每个附加值的输入,这些值还需要插入到“p\\u clrs”变量/数组中,以便对存在的每个“p\\u clrs”值执行此操作。迷路了吗?

    public function prod_colors_box() {
            global $post, $p_clr;
    $p_clr = array();
            $p_clrs = get_post_meta( $post->ID, \'p_clr\', true );
    ?>

    <div id="p_colors">
        <p>
            <label for="p_clr_1">
            <strong>Color:</strong> <input id="p_clr_1" name="p_clr" value="<?php echo $p_clrs; ?>" />
            </label>
        </p>
    </div>
        <h4><a href="#" id="addClr">Add Another Color</a></h4>

    <script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
    <script type="text/javascript">
    $(function() {

        var clrDiv = $(\'#p_colors\');
        var j = $(\'#p_colors p\').size() + 1;

        $(\'#addClr\').live(\'click\', function() {
            $(\'<p><label for="p_clr_\' + j + \'"><strong>Color:</strong> <input id="p_clr_\' + j + \'" name="p_clr" size="20" value="<?php echo $p_clrs; ?>" /></label> <a href="#" id="remClr">Remove</a></p>\').appendTo(clrDiv);
            j++;
            return false;
        });
        $(\'#remClr\').live(\'click\', function() { 
            if( j > 2 ) {
                $(this).parents(\'p\').remove(); 
                j--;
            } return false; 
        });
    });
    </script>

<?php
}

} // end of TypeProducts{} Class

谢谢任何人能给我的帮助,如果这是一个有点疯狂的帖子,我很抱歉。我很难将代码剪切/粘贴到这个文本区域。这对我来说是不可靠的。

如果我对我正在尝试/需要做的事情的解释不完全清楚,请告诉我。如果没有某种视觉效果,很难轻易描述。

1 个回复
最合适的回答,由SO网友:sorich87 整理而成

您只需修改生成的输入字段的name属性p_clrp_clr[]. $_POST[\'p_clr\'] 然后将是一个包含所有输入字段值的数组。

public function prod_colors_box() {
        global $post, $p_clr;
$p_clr = array();
        $p_clrs = get_post_meta( $post->ID, \'p_clr\' );
?>

<div id="p_colors">
    <?php foreach( $p_clrs as $key => $p_clr ) { ?>
    <p>
        <label for="p_clr_<?php echo $key; ?>">
        <strong>Color:</strong> <input id="p_clr_<?php echo $key; ?>" name="p_clr[]" value="<?php echo $p_clr; ?>" />
        </label>
    </p>
    <?php } ?>
</div>
    <h4><a href="#" id="addClr">Add Another Color</a></h4>

<script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
<script type="text/javascript">
$(function() {

    var clrDiv = $(\'#p_colors\');
    var j = $(\'#p_colors p\').size() + 1;

    $(\'#addClr\').live(\'click\', function() {
        $(\'<p><label for="p_clr_\' + j + \'"><strong>Color:</strong> <input id="p_clr_\' + j + \'" name="p_clr[]" size="20" value="<?php echo $p_clrs; ?>" /></label> <a href="#" id="remClr">Remove</a></p>\').appendTo(clrDiv);
        j++;
        return false;
    });
    $(\'#remClr\').live(\'click\', function() { 
        if( j > 2 ) {
            $(this).parents(\'p\').remove(); 
            j--;
        } return false; 
    });
});
</script>

结束

相关推荐

我可以将类别Metabox添加到附件吗?

我在用register_taxonomy_for_object_type() 将类别分类字段添加到媒体上载(附件)。我正在使用此代码执行此操作:add_action(\'init\', \'reg_tax\'); function reg_tax() { register_taxonomy_for_object_type(\'category\', \'attachment\'); } 这可以在查看图像时为媒体页面添加一个简单的分类文本字段。我真正想要的是让它显示实