返回

WordPress分类法图片获取指南:Taxonomy Images/ACF详解

php

WordPress 获取分类法(Taxonomy)和术语(Term)图片

最近有个需求,需要显示特定分类法下的所有术语及其对应的图片。 我用 get_terms() 函数获取了所有术语的详细信息,可图片这块儿卡住了。

贴一下我现在的代码:

<?php
$terms = get_terms( 'vehicle_type' );
foreach ($terms as $term) :
    echo $term->slug;
    $colors = apply_filters( 'taxonomy-images-get-terms', '', array(
        'taxonomy' => 'vehicle_type',
        'term_args' => array(
            'slug' => $term->slug,
            )
    )
);
foreach( (array) $colors as $color) :
    echo wp_get_attachment_image( $color->image_id, 'full', array('class' => 'alignnone'));
    //echo $term->name;
endforeach;

endforeach;
?>

这段代码的问题是,所有图片都显示成一样的路径了: http://localhost/mototrader/wp-includes/images/media/default.png。 我要的是跟每个分类关联的图片的真实路径! 怎么搞?

问题根源在哪?

初步判断,taxonomy-images-get-terms 这个过滤器可能没按预期工作。这个过滤器应该是用来获取分类法图片的插件(比如 Taxonomy Images)提供的。 但看起来,它要么没正确安装、启用,要么就是使用方式不对。 WordPress 本身不直接支持分类法或术语的图片功能。

另外,即便插件正常工作,$color->image_id 这种写法也未必准确。 要根据插件的实际输出数据结构来。

解决方案

下面提供几种可能的解决方案,大家按需选择。

方案一: 检查并正确使用 Taxonomy Images 插件

如果确实安装并启用了 “Taxonomy Images” 或类似功能的插件,首先保证插件是最新的, 然后要看下文档。

  1. 确认插件是否正常

    去 WordPress 后台的“插件”页面,看看这个插件是不是已经启用。 没启用就点“启用”。 有更新就点“更新”。

  2. 查看插件文档

    每个插件的用法都不太一样。找到插件的文档(通常在插件页面有链接,或者去 WordPress 插件库搜),看看 taxonomy-images-get-terms 过滤器的正确用法,尤其是返回值的结构。

  3. 修改代码

    根据文档调整获取图片 ID 的代码. 举个例子,假如文档说图片 ID 存在 $color->term_thumbnail_id 里,那就把代码改成:

    echo wp_get_attachment_image( $color->term_thumbnail_id, 'full', array('class' => 'alignnone'));
    

    一定要按实际情况修改!

方案二: 使用 Advanced Custom Fields (ACF) 插件

ACF 是个强大的自定义字段插件, 也能给分类法添加图片字段。

  1. 安装并启用 ACF

    在 WordPress 后台搜索并安装 “Advanced Custom Fields” 插件。

  2. 创建图片字段

    • 在 ACF 菜单里,新建一个字段组。
    • 在字段组里,添加一个“图像”类型的字段。
      • “字段标签” 填个好记的名字,比如 “分类图片”。
      • “字段名称” 也会自动生成一个,比如 category_image。 记住这个名称,后面要用。
      • “返回值格式” 可以选 “图像 ID” 或 “图像 URL”,根据你的需求来。 建议"图像ID", 方便后续操作。
    • 在 “位置” 规则里,选择 “分类法 等于 vehicle_type”。 (把 vehicle_type 换成你实际的分类法名称)
    • 保存字段组。
  3. 给分类添加图片

    • 进入你的分类法 (例如“车辆类型”) 的编辑页面。
    • 你会发现多了一个 “分类图片” 的字段。
    • 给每个分类上传或选择一张图片。
  4. 修改代码

    用 ACF 的 get_field() 函数获取图片:

    <?php
    $terms = get_terms( 'vehicle_type' ); // 把 'vehicle_type' 换成你实际的分类法
    foreach ($terms as $term) :
        echo $term->slug;
    
        $image_id = get_field('category_image', $term); // 'category_image' 是字段名称
    
        if( $image_id ) { // 检查一下是不是有图片
            echo wp_get_attachment_image( $image_id, 'full', array('class' => 'alignnone') );
        }
    
    endforeach;
    ?>
    

get_field('category_image', $term) 的第二个参数是关键。ACF 需要知道你要获取哪个对象的字段。对于分类法术语,直接传 $term 对象就行。

方案三: 使用原生 WordPress 函数(不推荐,但可以了解)

WordPress 其实没有直接给分类法或术语添加图片的功能。但咱也能“曲线救国”,把图片 ID 存到术语的元数据(term meta)里。不推荐,除非你真的不想用插件。

  1. 手动添加元数据(或用代码)

    • 去数据库里找到 wp_termmeta 表 (表前缀可能不一样).
    • 手动给每个术语添加一条记录. term_id 就是术语的 ID, meta_key 设成一个固定的值,比如 term_image_id, meta_value 就是图片的 ID.
    • 或者,写个 PHP 脚本,循环所有术语,用 add_term_meta() 函数来添加。
  2. 修改代码

    <?php
    $terms = get_terms( 'vehicle_type' );
    foreach ($terms as $term) :
        echo $term->slug;
    
        $image_id = get_term_meta( $term->term_id, 'term_image_id', true ); // 获取图片的 ID
    
        if( $image_id ) {
            echo wp_get_attachment_image( $image_id, 'full', array('class' => 'alignnone') );
        }
    
    endforeach;
    ?>
    

    get_term_meta 获取刚才存的图片 ID。

为什么不推荐原生方法?

  • 麻烦: 每次添加、修改、删除图片都要手动操作数据库或写代码。
  • 不好管理: WordPress 后台没有界面来管理这些图片。
  • 容易出错: 手动操作数据库容易出错,还可能影响网站稳定性。

进阶使用技巧 (针对ACF)

ACF提供了强大的功能, 如果要对分类法图片进行更多的操作:

  1. 不同尺寸的图片:
$image = get_field('category_image', $term);
    if( $image ) {
        echo '<img src="' . $image['sizes']['thumbnail'] . '" alt="' . $image['alt'] . '" />'; // 显示缩略图
        echo '<img src="' . $image['sizes']['medium'] . '" alt="' . $image['alt'] . '" />'; // 显示中等大小图片
        // ... 其他尺寸
    }

如果 `get_field` 返回的是图像对象,可以直接访问不同尺寸。
  1. 图片的其他信息:
 $image = get_field('category_image', $term);
    if( $image ) {
        echo '<img src="' . $image['url'] . '" alt="' . $image['alt'] . '" width="' . $image['width'] . '" height="' . $image['height'] . '" />';
        echo '<p>图片标题: ' . $image['title'] . '</p>';
        echo '<p>图片: ' . $image['description'] . '</p>';
         // ... 其他信息
      }

ACF 返回的图像对象包含了图片的各种信息,都可以拿来用。

  1. 条件判断 :
if( have_rows('category_image', $term) ): // 检查是否有图片字段
    while ( have_rows('category_image', $term) ) : the_row();
       $image = get_sub_field('image'); // 如果是repeater 或 flexible content字段中的图片
        if ($image)
        {
            //输出图片
        }
    endwhile;
else :
//没有图片
endif;

安全建议

不管用哪个方法,都注意一下:

  • 输入验证: 如果你的网站允许用户上传图片,一定要对上传的文件进行验证,防止恶意文件。
  • 权限控制: 确保只有授权的用户才能添加、修改分类法图片。
  • 备份: 定期备份数据库和文件,以防万一。

这些方法, 你觉得哪个更适合你? ACF 功能强大,推荐。 如果已经用了别的插件, 那就按插件的文档来. 原生方法最麻烦,不建议用。