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

问题描述 投票:1回答:1

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

问题:

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

似乎ACF 4正在保存这些字段,而不是像term_meta(正如它的设计),而是作为wp_option,在Wordpress选项表中。所以你不能使用terms_metameta_query)“查询get_terms()的术语”(codex)来获得一些基于某些term_meta值的术语。

wordpress advanced-custom-fields taxonomy taxonomy-terms
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 );

所以我们有:

  • 更新此ACF字段时使用term_metaupdate_term_meta())更新codex的过滤器(连接2次,一次用于color,一次用于shape
  • 使用term_metaget_term_meta())而不是codex(钩住2次,一次用于wp_option,一次用于color)返回shape值的过滤器

source

注1:

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

笔记2:

ACF5似乎支持开箱即用的真正的term_meta,但仍然只能提前访问。升级过程似乎包含针对此特定情况的重构方法(从wp_options到真正的term_metas的重复数据):

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.