我有一个简单的Woocommerce网站,我正在使用ACF pro在给定分类法的条款中添加一些自定义字段。例如,使用此功能,我可以在“产品类别”分类术语中添加“颜色”字段。好。
问题:
想使用get_terms()
(codex)进行查询,我发现我的meta_query
参数不起作用(意外结果)。为什么呢我的自定义字段不是(从后端)保存为term_meta
,而是保存为wp_option
。
似乎ACF 4正在将这些字段保存为不在Wordpress选项表中的term_meta
(如其设计的那样),而是保存为wp_option
。因此,您无法使用terms_meta
(codex)来通过meta_query
(get_terms()
)“查询词条”来基于某个term_meta
值来获取一些词条。
答案 0 :(得分:0)
我可以通过以下操作解决此问题:
假设我的分类术语中有两个自定义字段:color
和shape
(意味着我在给定分类法的后端术语“编辑/创建”页面上有颜色和形状输入)。 / p>
function acf_update_term_meta( $value, $post_id, $field ) {
$term_id = (int) filter_var( $post_id, FILTER_SANITIZE_NUMBER_INT );
if ( $term_id > 0 ) {
update_term_meta( $term_id, $field['name'], $value );
}
return $value;
}
add_filter( 'acf/update_value/name=color', 'acf_update_term_meta', 10, 3 );
add_filter( 'acf/update_value/name=shape', 'acf_update_term_meta', 10, 3 );
function acf_load_term_meta( $value, $post_id, $field ) {
$term_id = (int) filter_var( $post_id, FILTER_SANITIZE_NUMBER_INT );
if ( $term_id > 0 ) {
$value = get_term_meta( $term_id, $field['name'], true );
}
return $value;
}
add_filter( 'acf/load_value/name=color', 'acf_load_term_meta', 10, 3 );
add_filter( 'acf/load_value/name=shape', 'acf_load_term_meta', 10, 3 );
所以我们有:
term_meta
(codex)更新update_term_meta()
的过滤器(已挂钩2次,一次为color
,另一次为{{1} })shape
(codex)而不是term_meta
返回get_term_meta()
的值(钩了2次,一次是wp_option
,另一次是color
)注释1 :
这将触发所有具有shape
或color
自定义字段的字词(无论分类法)。如果您不希望分类法始终应用于这些领域,则可能需要按分类法进行过滤。
注释2 :
ACF5似乎支持开箱即用的真实shape
,但仅处于早期访问状态。
升级过程似乎包含针对此特定情况的重构方法(将数据从term_meta
复制到实际的wp_options
):
更新到ACF 5后,将提示您升级数据库。
这是跨字段和字段组迁移的必要步骤 4.x版中的设置。此升级还将复制到任何 从“ wp_options”表到“ wp_termmeta”的分类术语值 桌子。
在此升级期间,不会删除或修改任何数据。 (source)
注释3 :我相信可以在所有ACF术语自定义字段上循环,以自动为术语上的所有自定义字段“生成”此代码,并防止必须为每个新的ACF术语字段添加2个过滤器。但是,由于ACF5应该很快就会淘汰,所以这可能不值得。