因此,正如标题所说,我希望使用一个函数来获取站点范围内所有自定义字段(所有帖子、页面、CPT)的聚合列表。通常,我用几个SQL语句来实现这一点,并处理结果,但我想知道是否有人想出了一种更面向核心的方法来实现这一点。不过,大多数情况下,我想让其他人在网上找到一些可以轻松找到的东西。
以下是我通常使用的SQL:
SELECT DISTINCT `meta_key` FROM `prefix_postmeta` WHERE `meta_key` NOT LIKE "\\_%"
这里有一个函数可以拉取单个页面或帖子的自定义字段:
$custom_fields = get_post_custom($post->ID);
foreach ( $custom_fields as $field_key => $field_values ) {
if ( ! isset( $field_values[0] ) ) continue;
if ( in_array( $field_key, array( "_edit_lock", "_edit_last" ) ) ) continue;
echo $field_key . \'=>\' . $field_values[0];
}
所以基本上,我想要一个一次性的函数,我可以坚持
functions.php
例如,当我需要一个插件的所有自定义字段的最新剪切/粘贴列表时,可以调用该插件,该插件可以让您通过手动断开的链接检查器列出所有自定义字段。
最合适的回答,由SO网友:Jon 整理而成
下面的函数将存储在数组键中传递给它的帖子/页面/自定义帖子列表的所有自定义字段的不同列表$customfields
. 数组值是具有相应字段的帖子数。在本例中,插件添加的自定义字段被排除在外($value[0] != \'_\';
) 但这些可以很容易地添加回来。
function all_custom_fields($allposts) {
foreach ( $allposts as $post ) : setup_postdata($post);
$post_id = $post->ID;
$fields = get_post_custom_keys($post_id); // all keys for post as values of array
if ($fields) {
foreach ($fields as $key => $value) {
if ($value[0] != \'_\') { // exclude where added by plugin
$customfields[$value] = isset($customfields[$value]) ? $customfields[$value] + 1 : 1;
}
}
}
endforeach; wp_reset_postdata();
return $customfields;
}
// example - all post types, whether published or not
$args = array(
\'post_status\' => array(\'publish\',\'draft\',\'pending\',\'future\'),
\'post_type\' => \'any\',
\'posts_per_page\' => -1,
);
$allposts = get_posts($args);
$customfields = all_custom_fields($allposts);