如何使用 ACF 和分类术语的自定义字段(而不是 wp_options)来获得真正的 term_meta
How to get real term_meta using ACF with custom fields on taxonomy terms (instead of wp_options)
有一个简单的 Woocommerce 网站,我正在使用 ACF pro 将一些自定义字段添加到给定分类的术语中。例如,我可以使用它向我的 "product category" 分类术语添加一个 "color" 字段。好的。
问题:
想要使用 get_terms()
(codex) 进行一些查询,我发现我的 meta_query
参数不起作用(意外结果)。为什么 ?我的自定义字段没有(从后端)保存为 term_meta
而是保存为 wp_option
.
似乎 ACF 4 正在保存这些字段,而不是 term_meta
(它的设计目的),而是 wp_option
,在 Wordpress 选项 table 中。因此,您不能 "query terms by terms_meta
" (meta_query
) 使用 get_terms()
(codex) 来根据某些 term_meta
值获得某些术语。
我可以通过以下方式解决此问题:
假设我的分类术语有 2 个自定义字段:color
和 shape
(意味着我在后端术语 edit/create 页面上输入了给定的颜色和形状分类法)。
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 );
所以我们有:
- 更新此 ACF 字段时使用
update_term_meta()
(codex) 更新 term_meta
的过滤器(挂钩 2 次,一次用于 color
,一次用于 shape
)
- 使用
get_term_meta()
(codex) 而不是 wp_option
过滤 return term_meta
值(挂钩 2 次,一次用于 color
和一个 shape
)
注1:
这将触发具有 color
或 shape
自定义字段的所有术语(无论分类)。如果您不希望它始终适用于这些字段案例,您可能需要按分类法进行过滤。
注2:
ACF5 似乎支持开箱即用的真实 term_meta
,但仍处于抢先体验阶段。
升级过程似乎包含针对此特定情况的重构方法(从 wp_options
到真实 term_metas
的重复数据):
After updating to ACF 5, you will be prompted to upgrade the Database.
This is a necessary step to migrate across your field and field group
settings from version 4.x. This upgrade will also copy across any
taxonomy term values from the 'wp_options' table to the 'wp_termmeta'
table.
No data is deleted or modified during this upgrade. (source)
注释 3:我相信可以将所有 ACF 术语自定义字段循环到 "generate" 此代码自动为术语的所有自定义字段,并避免为每个新的 ACF 术语字段添加 2 个过滤器。不过ACF5应该快出来了,可能不值得。
有一个简单的 Woocommerce 网站,我正在使用 ACF pro 将一些自定义字段添加到给定分类的术语中。例如,我可以使用它向我的 "product category" 分类术语添加一个 "color" 字段。好的。
问题:
想要使用 get_terms()
(codex) 进行一些查询,我发现我的 meta_query
参数不起作用(意外结果)。为什么 ?我的自定义字段没有(从后端)保存为 term_meta
而是保存为 wp_option
.
似乎 ACF 4 正在保存这些字段,而不是 term_meta
(它的设计目的),而是 wp_option
,在 Wordpress 选项 table 中。因此,您不能 "query terms by terms_meta
" (meta_query
) 使用 get_terms()
(codex) 来根据某些 term_meta
值获得某些术语。
我可以通过以下方式解决此问题:
假设我的分类术语有 2 个自定义字段:color
和 shape
(意味着我在后端术语 edit/create 页面上输入了给定的颜色和形状分类法)。
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 );
所以我们有:
- 更新此 ACF 字段时使用
update_term_meta()
(codex) 更新term_meta
的过滤器(挂钩 2 次,一次用于color
,一次用于shape
) - 使用
get_term_meta()
(codex) 而不是wp_option
过滤 returnterm_meta
值(挂钩 2 次,一次用于color
和一个shape
)
注1:
这将触发具有 color
或 shape
自定义字段的所有术语(无论分类)。如果您不希望它始终适用于这些字段案例,您可能需要按分类法进行过滤。
注2:
ACF5 似乎支持开箱即用的真实 term_meta
,但仍处于抢先体验阶段。
升级过程似乎包含针对此特定情况的重构方法(从 wp_options
到真实 term_metas
的重复数据):
After updating to ACF 5, you will be prompted to upgrade the Database.
This is a necessary step to migrate across your field and field group settings from version 4.x. This upgrade will also copy across any taxonomy term values from the 'wp_options' table to the 'wp_termmeta' table.
No data is deleted or modified during this upgrade. (source)
注释 3:我相信可以将所有 ACF 术语自定义字段循环到 "generate" 此代码自动为术语的所有自定义字段,并避免为每个新的 ACF 术语字段添加 2 个过滤器。不过ACF5应该快出来了,可能不值得。