我想做的是创建一个自定义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脚本,它添加和删除了其他输入字段,如果添加的框不为空,这些字段在保存帖子时“可能”成为元框。
这是一张我的意思图片,让你了解我在说什么。
当前,第一个输入显示在页面加载上,其中包含存储的任何值(如果有)。单击“添加另一个”链接时,它会添加具有相同值的另一个输入,但在任何输入字段中保存不同值时,它会保存具有值的最后一个输入的值。并且在保存页面时,只在重新加载页面时显示一个输入。我需要显示存在的每个附加值的输入,这些值还需要插入到“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
谢谢任何人能给我的帮助,如果这是一个有点疯狂的帖子,我很抱歉。我很难将代码剪切/粘贴到这个文本区域。这对我来说是不可靠的。
如果我对我正在尝试/需要做的事情的解释不完全清楚,请告诉我。如果没有某种视觉效果,很难轻易描述。