WordPress - 如何将指定分类中的特色图片显示为背景?

4

首先,PHP不是我的强项,但我们来试试吧。

我在functions.php中有一个函数,它获取特色图片并将其设置为背景。然后这个函数在header.php中被调用。

function set_post_background() {
  if(query_posts(array ('category_name' => 'results')));
    if (have_posts()) : while (have_posts()) : the_post(); 
        global $post;
        $bgimage = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), "Full");
        if (!empty($bgimage)) {
            return '<style type="text/css">body {background:#fff url('.$bgimage[0].') no-repeat top center;}</style>';
        }
endwhile; endif;
wp_reset_query();
}

昨晚,我尝试修改函数,并将其包装在query_posts()中。我设法让它有点工作了。现在,如果文章特色图像位于“结果”类别中,它将仅获取该图像并将其设置为背景。
但是,这段代码中有问题,因为现在我的页面内容都没有显示出来。禁用该函数后,内容就会恢复显示。
我做错了什么?
[编辑] 我认为是我查询类别名称的方式有问题。因为page.php类似的查询可以获得the_content(),我认为该函数正在覆盖该查询,因此未显示页面内容。

你的项目已经上线了吗?我能看到正在发生什么吗? - Deepak saini
目前仅限本地。启用该功能后,似乎无法加载此代码(post.php)<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?> <?php if ( is_front_page() ) { ?> <h2><?php the_title(); ?></h2> <?php } else { ?> <h1><?php the_title(); ?></h1> <?php } ?> <?php the_content(); ?> <?php wp_link_pages( array( 'before' => '' . __( 'Pages:', 'twentyten' ), 'after' => '' ) ); ?> <?php edit_post_link( __( 'Edit', 'twentyten' ), '', '' ); ?> <?php comments_template( '', true ); ?> <?php endwhile; ?> - peter beard
2个回答

1
问题在于你正在使用query_posts,这将改变默认主查询的结果。这意味着页面的默认内容将被来自results类别的内容所替代。请尝试以下方法:
function set_post_background() {
    $query = new \WP_Query(['category_name' => 'results']);
    if ($query->have_posts()) {
        while ($query->have_posts()) : $query->the_post();
        $bgimage = wp_get_attachment_image_src(get_post_thumbnail_id($query->post->ID), 'full');
        if (!empty($bgimage)) {
            return '<style type="text/css">body{background:#fff url('.$bgimage[0].') no-repeat top center}</style>';
        }
        endwhile;
    }
    wp_reset_query();
}

在任何情况下,不要使用 query_posts() 函数来查询文章。参考文献中说明:

注意:此函数不适用于插件或主题。正如后面所解释的那样,有更好的、更高效的选项来修改主查询。query_posts() 过于简单化,是通过用新实例替换页面主查询的一种有问题的方式来修改页面主查询。它效率低下(重新运行 SQL 查询)并且在某些情况下会直接失败(特别是处理文章分页时经常发生)。


嗨,这很奇怪。当你发布这个问题时,我编辑了我的回答,说我认为是查询语句引起的问题。虽然有语法错误 $query = new \WP_Query(['category_name' => 'results']); - peter beard
@peterbeard 这个函数运行良好。你使用的是哪个PHP版本?将['category_name' => 'results']更改为array('category_name' => 'results'),然后看看会发生什么。 - wpclevel
我们正在取得进展。那个更改有点起作用了。现在它可以获取类别为“结果”的文章的特色图片,这很好。但是现在似乎只能获取该类别中的第一篇文章,而不是最新的文章?例如,我有“文章1”和“文章2”。即使将“文章2”设置为“结果”类别-它仍然显示“文章1”的特色图片。 - peter beard
@peterbeard 在循环内找到第一个 $bgimage 后,我们就返回 CSS,然后循环会停止。因此,如果 post 1post 2 都有 featured image,那么将显示 post 1featured image。这是正常的。要获取最后一个 featured image,可以使用 'order' => 'ASC' 更改查询帖子的顺序。 - wpclevel
当然!那现在完美地运作了,你帮我省去了很多麻烦!非常感谢 :) - peter beard

0
请将以下代码替换为您的代码,它应该可以正常工作。
function set_post_background() {
$cat_ids=array();
$img='';
$cat_ids=wp_get_post_categories();

foreach($cat_ids as $cat_id){
    $img=wpds_tax_pic_url($cat_id);
}
if (!empty($img)) {
  return '<style type="text/css">body {background:#fff url('.$img.') no-repeat top center;}</style>';
}}

而且你还可以在“else”语句中设置默认图像

试一下!...


谢谢您的回复。在这段代码中,我在哪里定义类别名称? - peter beard
您不需要指定类别名称。"wp_get_post_categories"获取当前文章对象关联的类别ID。因此,请在那里替换您的函数。 - Buddhika Dombawela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接