1

拥有一个简单的 Woocommerce 网站,我正在使用 ACF pro 将一些自定义字段添加到给定分类的条款中。例如,使用它,我可以将“颜色”字段添加到我的“产品类别”分类术语中。好的。

问题:

想要使用get_terms()codex)进行一些查询,我发现我的meta_query参数不起作用(意外结果)。为什么 ?我的自定义字段没有(从后端)保存term_metawp_option.

似乎 ACF 4 正在保存这些字段,而不是term_meta(按其设计目的),而是保存wp_option在 Wordpress 选项表中。因此,您不能使用(codexterms_meta )“通过”( )查询术语以根据某些值获取某些术语。meta_queryget_terms()term_meta

4

1 回答 1

0

我可以通过以下方式解决此问题:

假设我的分类术语有 2 个自定义字段:colorshape(意味着我在给定分类的后端术语编辑/创建页面上有颜色和形状输入)。

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更新此 ACF 字段时更新使用update_term_meta()codex )的过滤器(挂钩 2 次,一次用于color,一次用于shape
  • 一个过滤器,term_meta使用get_term_meta()( codex ) 而不是wp_option(钩住 2 次,一次 forcolor和一次 for shape)返回值

资源

注1

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

注2

ACF5似乎支持开箱即用的 real term_meta,但仍处于早期访问阶段。升级过程似乎包含针对这种特殊情况的重构方法(将数据从 real 复制wp_options到 real term_metas):

更新到 ACF 5 后,系统会提示您升级数据库。

这是从 4.​​x 版跨字段和字段组设置迁移的必要步骤。此升级还将跨任何分类术语值从“wp_options”表复制到“wp_termmeta”表。

在此升级过程中不会删除或修改任何数据。(来源

注意 3:我相信可以在所有 ACF 术语自定义字段上循环以自动为术语上的所有自定义字段“生成”此代码,并避免为每个新的 ACF 术语字段添加 2 个过滤器。但由于 ACF5 应该很快就会出局,所以可能不值得花时间。

于 2018-08-23T16:38:59.437 回答