自定义帖子类型和标准帖子不显示或工作

时间:2020-10-11 作者:Krys

我想在首页显示5个自定义帖子类型“project”的图像和1个标准帖子。我尝试将两个查询合并到一个查询中,但它不起作用。

仅供参考:我已经为缩略图设置了主题支持。

这是我目前在头版上看到的内容,但没有显示出来:

<div class="content lg-grid">
    <?php

    $query1 = new WP_Query(array(
        \'project\' => array(
            \'posts_per_page\' => 5,
            \'post_type\' => \'project\'
        )
    ));
    $query2 = new WP_Query(array(
        \'post\' => array(
            \'posts_per_page\' => 1,
            \'category\' => \'art\'
        )
    ));
    $result = new WP_Query();
    $result->posts = array_merge($query1->posts, $query2->posts);

    while ($result->have_posts()) : $result->the_post(); ?>
            <div class="project-item">
                <a href="<?php the_permalink(); ?>">
                    <img src="<?php the_post_thumbnail(); ?>" />
                    <h5 class="title"><?php the_title(); ?></h5>
                </a>
            </div>

    <?php endwhile;
    endif; ?>
</div>


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

您的查询参数包含一个嵌套数组,因此它不会以这种方式工作-如下项posts_per_page 属于主阵列(例如。new WP_Query( array( \'posts_per_page\' => 5 ) )). 所以应该是这样的:

请注意\'category\' => \'art\' 行不通。相反,请使用category_name 按类别查询帖子的参数。

$query1 = new WP_Query( array(
    \'posts_per_page\' => 5,
    \'post_type\'      => \'project\',
) );
$query2 = new WP_Query( array(
    \'posts_per_page\' => 1,
    \'category_name\'  => \'art\',
) );
$posts = array_merge( $query1->posts, $query2->posts );
其次,你不需要第三个WP_Query 实例(即。$result). 相反,您可以使用foreach 回路代替while, 然后使用setup_postdata() 设置全局post变量($post) 因此,其功能如下the_permalink()the_title() 将按预期工作。

请注意the_post_thumbnail() 不返回帖子缩略图的URL;相反,它会显示帖子缩略图,即。echo $result八 标记,因此不能在图像的src 属性

foreach ( $posts as $post ) : setup_postdata( $post ); ?>
    <div class="project-item">
        <a href="<?php the_permalink(); ?>">
            <?php the_post_thumbnail(); ?>
            <h5 class="title"><?php the_title(); ?></h5>
        </a>
    </div>
<?php endforeach;
现在应该可以了。

但我认为没有必要合并这些帖子,我可能会使用template part 用于查询和显示标准帖子,然后从front-page.php 模板:

  • front-page.php

    <?php
    // Query 5 "project" posts.
    $projects = new WP_Query( [
        \'posts_per_page\' => 5,
        \'post_type\'      => \'project\',
    ] );
    
    $i = 0; // post counter
    while ( $projects->have_posts() ) : $projects->the_post();
        // Displays the default post before the first "project".
        if ( 0 === $i ) {
            get_template_part( \'my-template-part\' ); // no .php
        }
    ?>
        your code
    <?php
        $i++;
    endwhile;
    
    wp_reset_postdata();
    ?>
    
  • my-template-part.php:

    <?php
    // Query 1 standard post.
    $art_posts = new WP_Query( [
        \'posts_per_page\' => 1,
        \'category_name\'  => \'art\',
    ] );
    
    while ( $art_posts->have_posts() ) : $art_posts->the_post();
    ?>
        your code
    <?php
    endwhile;
    
    wp_reset_postdata();
    ?>