如何使用 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 个自定义字段:colorshape(意味着我在后端术语 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)

source

注1:

这将触发具有 colorshape 自定义字段的所有术语(无论分类)。如果您不希望它始终适用于这些字段案例,您可能需要按分类法进行过滤。

注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应该快出来了,可能不值得。