如何让图像(带有缩略图预览)显示在搜索结果中?

时间:2018-04-08 作者:Dylan Knowles

The Short Version

我已经建立了一个Wordpress网站(宪报主题库),有很多图像媒体。它们都有描述、标题和标题,但不会显示在搜索结果中;使用Relevansi,我可以显示他们的标题和描述,但没有显示任何图像!如何使图像媒体显示在带有图像缩略图的搜索结果中?

Context:

我为一个铁匠建立了一个产品组合网站。每一页都有多个图像库:例如,“;“定制件”;有各种类型的刀、剑和其他具有独特名称的物品;“轴”;拥有他生产的各种标准轴,等等。因为客户可能正在寻找某个特定描述的东西,而不知道它的所在地,所以他们可能会进行大量搜索。然而,我发现Wordpress的默认搜索没有多大帮助,完全排除了图像媒体。如果我搜索;大马士革“;,例如,尽管在标题、描述和标题中有几十幅大马士革的图片,但我还是没有得到任何结果!我安装了Relevansi,它会使所有相关媒体显示在搜索结果中,但没有一个图像实际显示:

enter image description here

如果搜索找到任何带有特色图像的帖子、页面或其他项目,则会显示图像缩略图。由于图像(似乎)没有该字段,我不知道如何让它们显示缩略图。我只是对Wordpress API不太熟悉,不知道该去哪里查看或做什么。什么PHP 我是否需要调用来显示这些图像,或者是否有一个插件可以完全满足我的需要?(我不是一名web开发人员,但我有软件工程背景和一些基本的web经验。)

提前感谢!

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

这需要在主题的搜索结果模板中处理。如果主题是现成的,则可能不支持附件的缩略图,因为—正如您所经历的—附件通常不会出现在搜索结果中。

这是因为在普通主题中,每个结果都将使用the_post_thumbnail() 函数显示缩略图。在引擎盖下,特色图片本身是一个附件类型的帖子。此函数用于获取帖子特色图像的ID,并在中使用该IDwp_get_attachment_image(), 输出附件的图像/缩略图。

由于附件帖子没有特色图片,因为它们本身就是附件,所以此功能不会显示任何内容。

因此,要显示附件帖子的图像,模板需要检查帖子是否是附件,如果是,则跳过the_post_thumbnail() 并直接转到wp_get_attachment_image() 使用帖子自己的ID。您可以从this example 这就是附件模板显示图像的方式。

实际上,这类似于:

if ( get_post_type() === \'attachment\' ) {
    echo wp_get_attachment_image( get_the_ID(), \'large\' );
} else {
    the_post_thumbnail( \'large\' );
}
确切的image size 用以代替\'large\' 取决于主题已使用的内容。

这将涉及修改主题文件,确切的文件取决于原始主题。您需要根据Template Hierarchy 查看实际使用的文件。无论是哪个文件,都应该通过创建Child Theme. 这将确保更改不会受到主题更新的影响,而主题更新通常会删除任何更改。

另一种不涉及修改模板(但仍需要创建子主题或自定义插件来放入代码)的方法是过滤帖子缩略图ID的请求。

在内心深处the_post_thumbnail() 使用get_post_meta( $post->ID, \'_thumbnail_id\', true ); 获取作为帖子特色图片的附件ID。您可以对此进行筛选,以便如果WordPress为帖子请求该元数据,而帖子是附件,则返回附件的ID。

您可以使用get_post_metadata 过滤器:

function wpse_300128_attachment_post_thumbnail( $value, $post_id, $meta_key, $single ) {
    if ( get_post_type( $post_id ) === \'attachment\' && $meta_key === \'_thumbnail_id\' ) {
        return $single ? $post_id : array( $post_id );
    }
}
add_filter( \'get_post_metadata\', \'wpse_300128_attachment_post_thumbnail\', 10, 4 );
当该过滤器处于活动状态时,WordPress在任何时候尝试获取附件帖子的缩略图ID时,都会收到该ID。返回值可以是ID,也可以是基于$single. 这样,无论原始调用是否$single 设置为true或false。

结束

相关推荐

Php将博客文章显示为网格视图

我目前正在home.php 文件,我计划在“网格视图”中显示我的最后一篇博客文章,这样一行中就有4个容器,包含标题和更多信息。我试过一些东西,但都没有按我想要的方式工作。我做的最后一件事是像这样放置一个for循环:<?php for ($x = 1; $x <= 6; $x++) : ?> <div id=\"home_post_<?php echo $x ?> \" class=\"home_post\">