如何使用带有分类术语的自定义字段的ACF获得真实term_meta(而不是wp_options)

时间:2018-08-23 16:38:59

标签: wordpress advanced-custom-fields taxonomy taxonomy-terms

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

问题:

想使用get_terms()codex)进行查询,我发现我的meta_query参数不起作用(意外结果)。为什么呢我的自定义字段不是(从后端)保存为term_meta,而是保存为wp_option

似乎ACF 4正在将这些字段保存为不在Wordpress选项表中的term_meta(如其设计的那样),而是保存为wp_option。因此,您无法使用terms_metacodex)来通过meta_queryget_terms())“查询词条”来基于某个term_meta值来获取一些词条。

1 个答案:

答案 0 :(得分:0)

我可以通过以下操作解决此问题:

假设我的分类术语中有两个自定义字段:colorshape(意味着我在给定分类法的后端术语“编辑/创建”页面上有颜色和形状输入)。 / 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 );

所以我们有:

  • 一个用于在更新此ACF字段时使用term_metacodex)更新update_term_meta()的过滤器(已挂钩2次,一次为color,另一次为{{1} })
  • 一个过滤器,该过滤器使用shapecodex)而不是term_meta返回get_term_meta()的值(钩了2次,一次是wp_option,另一次是color

source

注释1

这将触发所有具有shapecolor自定义字段的字词(无论分类法)。如果您不希望分类法始终应用于这些领域,则可能需要按分类法进行过滤。

注释2

ACF5似乎支持开箱即用的真实shape,但仅处于早期访问状态。 升级过程似乎包含针对此特定情况的重构方法(将数据从term_meta复制到实际的wp_options):

  

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

     

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

     

在此升级期间,不会删除或修改任何数据。 (source

注释3 :我相信可以在所有ACF术语自定义字段上循环,以自动为术语上的所有自定义字段“生成”此代码,并防止必须为每个新的ACF术语字段添加2个过滤器。但是,由于ACF5应该很快就会淘汰,所以这可能不值得。