获取所有类别的元字段值

时间:2013-06-29 作者:ajay

我正在为类别设置一个元字段,并获得每个字段的元值,如下所示:

$cat_meta = get_option( "meta_field_$cat1" );
if (isset($cat_meta[\'color\'])){
    $cat1_color = $cat_meta[\'color\'];
}
我可以使用循环获取所有类别的非空元字段值吗?

2 个回复
最合适的回答,由SO网友:Coen Jacobs 整理而成

如果你使用get_categories() function 要获取所有类别,可以循环遍历它们。部分伪代码,但这样做可以:

$categories = get_categories( array() );
$colors = array();

foreach ( $categories as $category ) {
$cat_meta = get_option( \'meta_field_\' . $category->slug );
if (isset($cat_meta[\'color\'])){
    $colors[ $category->term_id ] = $cat_meta[\'color\'];
}
}
另外,我不知道选项表中的字段是使用slug还是类别id。颜色数组将填充类别id作为键,元字段的值作为值。

PPS。get_categories() 函数调用可能需要数组中的一些额外参数,请使用available parameters.

购买力平价。虽然我的回答从技术上回答了这个问题,this answer by s_ha_dum 实际上是一种更好的方法(可能需要更多的重构)。

SO网友:s_ha_dum

使用get_categories 就像@CoenJacobs一样,答案是一条路要走。不过,这样的循环可能不是很有效。

get_option 不允许通过通配符进行搜索,这是由于您构造键的方式,这是避免循环所需的,但像这样的简单查询可以做到这一点:

$cat_meta = $wpdb->get_results("SELECT option_name,option_value FROM {$wpdb->options} WHERE option_value != \'\' AND option_name LIKE \'meta_field_%\'");
然后,您的循环看起来像(如果我没有读错的话):

foreach ( $cat_meta as $meta ) {
  if (\'color\' == $meta[\'option_value\']){
    $colors[ $meta[\'option_name\'] ] = $meta[\'option_value\'];
  }
}
当我看到有必要这样做时,我总是想知道真正的问题是否不是数据的存储方式。您可能需要考虑将您的类别元存储为单个键下的序列化数组。这是否是一个好主意取决于以下几点:

您需要在密钥中存储多少数据虽然检索时可以在一个键中存储大量数据,但始终必须检索并处理所有数据。这可能不会比上面的查询更有效。

尝试在序列化数组/对象中搜索,例如使用SQL 效率极低且容易出错。

存储和检索数组/对象的实际机制很简单。WordPress几乎为您完成了这项工作。

add_option(\'test_option_name\',array(\'a\',\'b\',\'c\'));

var_dump(get_option(\'test_option_name\'));

结束

相关推荐

自定义Metabox附加项

我有一个自定义元数据库,它有两个选项:URL和一个名为“推荐”的文本框。URL框工作得很好(当我在admin上的这个字段中输入一些文本时,文本会出现在网站上),但推荐框(相同的建议)不起作用。有什么问题或遗漏了什么?<?php add_action(\'admin_init\', \'portfolio_meta_init\'); function portfolio_meta_init() { // add a meta box for Word