wordpress 如何使用ACF〈5.0获取真实的的term_ meta,并在分类术语上使用自定义字段(而不是wp_options)

yzxexxkh  于 2023-03-01  发布在  WordPress
关注(0)|答案(1)|浏览(225)

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

问题:

我想使用get_terms()codex)做一些查询,我发现我的meta_query参数不起作用(意外结果)。为什么?我的自定义字段没有保存(从后端)为term_meta,而是保存为wp_option
ACF4似乎没有将这些字段保存为term_meta(如其设计),而是保存为wp_option,在Wordpress选项表中。因此,您无法使用get_terms()codex)“按terms_meta查询术语“(meta_query)来获取基于某个term_meta值的术语。

lsmepo6l

lsmepo6l1#

我可以通过执行以下操作修复此问题:
假设我的分类术语中有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字段时使用update_term_meta()codex)更新term_meta的过滤器(挂接2次,一次用于color,一次用于shape
  • 使用get_term_meta()codex)而不是wp_option返回term_meta值的过滤器(挂接2次,一次用于color,一次用于shape

source

注1

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

注2

ACF5似乎支持开箱即用的real term_meta,但仍处于早期访问阶段。升级过程似乎包含针对此特定情况的重构方法(将数据从wp_options复制到real term_metas):
更新到ACF 5后,系统将提示您升级数据库。
这是从4.x版跨字段和字段组设置迁移的必要步骤。此升级还将跨所有分类术语值从"wp_options"表复制到"wp_termmeta"表。
在此升级过程中未删除或修改任何数据。(source

注3:我相信这将是可能的循环对所有的ACF术语自定义字段"生成"这个代码自动为所有自定义字段的术语,并防止必须添加2过滤器为每个新的ACF术语字段。但由于ACF5应该很快出去,这可能是不值得的时间。

相关问题