有一个简单的Woocommerce网站,我正在使用ACF专业版为特定分类法的条款添加一些自定义字段。例如,使用此功能,我可以在“产品类别”分类术语中添加“颜色”字段。好。
问题:
想要使用get_terms()
(codex)进行一些查询,我发现我的meta_query
参数不起作用(意外的结果)。为什么?我的自定义字段没有保存(从后端)作为term_meta
但是作为wp_option
。
似乎ACF 4正在保存这些字段,而不是像term_meta
(正如它的设计),而是作为wp_option
,在Wordpress选项表中。所以你不能使用terms_meta
(meta_query
)“查询get_terms()
的术语”(codex)来获得一些基于某些term_meta
值的术语。
我可以解决这个问题:
假设我的分类术语中有2个自定义字段:color
和shape
(意味着我在后端术语上有颜色和形状输入编辑/创建给定分类的页面)。
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
(update_term_meta()
)更新codex的过滤器(连接2次,一次用于color
,一次用于shape
)term_meta
(get_term_meta()
)而不是codex(钩住2次,一次用于wp_option
,一次用于color
)返回shape
值的过滤器注1:
这将触发具有color
或shape
自定义字段的所有术语(无论分类法)。如果您不希望它始终应用于这些字段情况,则可能需要按分类法进行过滤。
笔记2:
ACF5似乎支持开箱即用的真正的term_meta
,但仍然只能提前访问。升级过程似乎包含针对此特定情况的重构方法(从wp_options
到真正的term_metas
的重复数据):
更新到ACF 5后,系统将提示您升级数据库。
这是从版本4.x迁移到字段和字段组设置的必要步骤。此升级还将复制从'wp_options'表到'wp_termmeta'表的任何分类术语值。
在此升级期间,不会删除或修改任何数据。 (source)
注3:我相信可以在所有ACF术语自定义字段上循环,为术语上的所有自定义字段自动“生成”此代码,并防止必须为每个新的ACF术语字段添加2个过滤器。但是,由于ACF5应该很快就会出来,可能不值得花时间。