FrontPage上的GET_TEMPLATE_PART和两个全局WP_Query

时间:2015-06-26 作者:mashup

我正在一个网站上工作,在那里我使用get\\u template\\u part检索循环。在我指定的模板的标题中,它运行全局查询。

global $user_ID, $wp_query, $pagename;
现在,如果我想在同一页面上进行多个查询,那么最佳实践会怎么说?我试图简单地进入并指定另一个全局变量e.g. $wp_query2 在标题中,但我在某个地方读到,使用全局变量实际上是不好的做法。

不幸的是,我不能依靠Slug来完成循环,否则我会使用它。这是首页。我在想passing a variable via "get_template_part" 但这不受支持?

从来没有这样做过,那么你会用什么呢?

2 个回复
最合适的回答,由SO网友:Howdy_McGee 整理而成

你不应该把主要$wp_query, 仅辅助查询。

举下面的例子,如果我有一个非常简单的frontpage.php 模板看起来像:

<?php get_header(); ?>

    <?php get_template_part( \'templates/template\', \'main-query\' ); ?>

<?php get_footer(); ?>
然后,我可以在中创建模板/theme-name/templates/template-main-query.php 具有正常循环:

<?php if( have_posts() ) : ?>

    <?php while( have_posts() ) : the_post(); ?>

        <h1><?php the_title(); ?></h1>
        <?php the_content(); ?>

    <?php endwhile; ?>

<?php endif; ?>
注意,我不需要任何类型的全局查询,除非我想访问以下任何查询方法/属性found_posts 或者类似的东西。

对于辅助查询,您可以将查询全球化,但更好的解决方案是包含如下模板:

<?php get_header(); ?>

    <?php 
        get_template_part( \'templates/template\', \'main-query\' );

        $all_pages = new WP_Query( array(
            \'post_type\'     => \'page\',
            \'posts_per_page\'=> -1
        ) );

        require_once( locate_template( \'templates/template-secondary-query.php\' ) );
    ?>

<?php get_footer(); ?>
然后,我们的模板文件如下所示:

<?php if( $all_pages->have_posts() ) : ?>

    <?php while( $all_pages->have_posts() ) : $all_pages->the_post(); ?>

        <h1><?php the_title(); ?></h1>

    <?php endwhile; ?>

<?php endif; ?>
如果可能的话,只包括次要的new WP_Query 而不是将查询放在一个文件中,然后在另一个文件中循环。如果我没有弄错的话,这是WooCommerce在模板文件中用于二次查询的方法,它们只是在文件的顶部包含新查询。

SO网友:Radu Dragomir

这就是如何在模板中进行其他查询。去掉你不需要的任何论点部分。

$paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
$args = array( \'post_type\'=>\'post\', \'posts_per_page\'=>-1, \'paged\'=>$paged );
$args = array_merge( $args, array( \'orderby\'=>\'menu_order\', \'order\'=>\'ASC\' ) );
$args[\'tax_query\'] = array(
    array(
        \'taxonomy\' => \'tax_slug\',
        \'terms\' => $term_id,
        \'field\' => \'id\',
    ),
);
$args[\'meta_query\'] = array(
    array(
        \'key\' => \'meta_key\',
        \'value\' => $value,
        //\'compare\' => \'IN\',
    ),
);
$data = new WP_Query($args);
while( $data->have_posts() ) {
  $data->the_post();
  // show data from the post
}
wp_reset_query();

结束

相关推荐