php 如何在包含文件中获得正确的post_count和found_posts

3phpmpom  于 2023-11-16  发布在  PHP
关注(0)|答案(3)|浏览(131)

我已经创建了一个包含文件,它允许我使用类别筛选器来过滤我的帖子查询。我试图动态获取post_countfound_posts,以便我可以显示Showing 6 out of 12 Posts。我在自定义页面模板上包含此过滤器,并使用自定义WP_Query,但我得到Showing 1 out of 1 Posts尽管有10+ posts.我相信它这样做的原因是因为过滤器包含使用单页查询,而不是我的自定义帖子查询.我如何去更新这一点,使过滤器使用我的自定义发布查询?

inc/filter.php:

<?php
    global $wp_query;
    $count = $wp_query->post_count;
    $total = $wp_query->found_posts;
?>

<div class="container">
    <div class="row">
        <div class="col">
            <?php $get_categories = get_categories(); ?>
            <select>
                <option selected disabled>Select category</option>
                <option value="all">All</option>
                <?php
                    if ($get_categories) :
                        foreach ($get_categories as $cat) :
                    ?>
                    <option value="<?php echo $cat->term_id; ?>">
                        <?php echo $cat->name; ?>
                    </option>
                    <?php endforeach; 
                        endif;
                    ?>
            </select>
            <div class="shown-posts">Showing <span class="visible-posts"><?php echo $count; ?></span> of <span class="total-posts"><?php echo $total; ?></span> posts</div>
        </div>
    </div>
</div>

字符串

这是我的自定义页面模板:

<?php get_header();?>
<?php 
    $posts = new WP_Query(array(
        'post_type' => 'post'
    ));
?>
<?php if($posts->have_posts()): ?>
    // Here's where I'm including the filter file
    <?php get_template_part( 'inc/filter' ); ?>
    <div class="container post-container">
        <div class="row row-eq-height">
            <?php while ($posts->have_posts()) : $posts->the_post();
                the_title();
            endwhile; ?>
        </div>
    </div>
<?php endif; ?>

wz8daaqr

wz8daaqr1#

通过get_template_part()传递变量到模板的正确方法是将它们添加到WordPress query_vars
所以在inc/filter.php中删除所有这些.

<?php
    global $wp_query;
    $count = $wp_query->post_count;
    $total = $wp_query->found_posts;
?>

字符串
然后在主模板中添加.

<?php 
    $posts = new WP_Query(array(
        'post_type' => 'post'
    ));

    set_query_var( 'count', $posts->post_count );
    set_query_var( 'total', $posts->found_posts );
?>

baubqpgj

baubqpgj2#

inc/filter.php中的计算修改为:

<?php
    $count = $posts->post_count;
    $total = $posts->found_posts;
?>

字符串
你是对的,全局WP_Query对象指向的是包含所有这些的单个页面。示例化一个新的WP_Query不会覆盖全局WP_Query。最后,请注意,当你include the filter file时,你的作用域没有任何变化--所以,只要继续使用你已经设置的$posts变量。

2jcobegt

2jcobegt3#

更新2023

(实际上,自WP 5.5中期以来,尽管很多人不使用它
在主模板中,只有一行:

// Here's where I'm including the filter file
<?php
get_template_part('inc/filter', null, [
    'count' => $posts->post_count,
    'total' => $posts->found_posts
]);
?>

字符串

WordPress文档

从WordPress 5.5开始,模板加载函数现在允许使用新的$args参数将额外的参数传递到匹配的模板文件。
多年来,希望将数据传递到模板文件的主题开发人员不得不使用不太理想的解决方案。这包括使用全局变量,set_query_var(),include(locate_template())模式,或自己版本的get_template_part()等。
https://make.wordpress.org/core/2020/07/17/passing-arguments-to-template-files-in-wordpress-5-5/

相关问题