修改后的主页查询未产生预期结果

时间:2013-06-30 作者:Zayatzz

昨天,我问如何最好地将所有现有页面及其内容加载到首页,以创建单页布局。(Single page theme)

根据该页面上的信息,我创建了自己的pre\\u get\\u posts挂钩函数。php:

function show_all_pages_on_index( $query ) {
    if ( (is_front_page() || is_home()) && $query->is_main_query() ) {
        $query->set(\'post_type\', \'page\');
        $query->set(\'parent\', \'0\');
        $query->set(\'post_status\', \'publish\');
        $query->set(\'orderby\', \'menu_order\');
        $query->set(\'order\', \'ASC\');
    }
}
add_action( \'pre_get_posts\', \'show_all_pages_on_index\' );
如果我把echo放在那里,它就会被打印出来,所以我想挂钩是有用的。

但这段代码在索引中。php仍然只打印使用wordpress安装:index创建的初始博客帖子。php:

$myposts = get_posts();
foreach( $myposts as $post ) :  setup_postdata($post);

    echo "<li><a href=\'". the_permalink() ."\'>". the_title()."</a></li>";

endforeach; 
wp_reset_postdata();
HTML:

http://localhost/hello-world/Hello world!<li><a href=\'\'></a></li>
编辑-以单页布局的形式显示在我的案例中起作用的内容:

功能。php:

function show_all_pages_on_index( $query ) {
    if ( (is_front_page() || is_home()) && $query->is_main_query() ) {
        $query->set(\'post_type\', \'page\');
        $query->set(\'post_parent\', 0);
        $query->set(\'post_status\', \'publish\');
        $query->set(\'orderby\', \'menu_order\');
        $query->set(\'order\', \'ASC\');
    }
}
add_action( \'pre_get_posts\', \'show_all_pages_on_index\' );
索引。php:

while ( have_posts() ) {
    the_post();
    get_template_part( \'content\', \'page\' );
}
从那以后,wordpress自己的tempate逻辑将接管内容页的使用。php或内容。php,这几乎意味着您可以为子页面创建不同的模板,但您需要创建它们,以便它们实际适合单个页面布局。

感谢所有贡献者:)

2 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

你为什么认为它应该做其他事情?

您所做的是:

您可以添加过滤器来修改在索引页上运行的默认WordPress查询。您的修改正确-此查询将选择已发布的根页面。

然后你就跑get_posts 使用默认参数集(见下文)并循环使用它们。

的默认参数get_posts:

$args = array(
    \'posts_per_page\'  => 5,
    \'offset\'          => 0,
    \'category\'        => \'\',
    \'orderby\'         => \'post_date\',
    \'order\'           => \'DESC\',
    \'include\'         => \'\',
    \'exclude\'         => \'\',
    \'meta_key\'        => \'\',
    \'meta_value\'      => \'\',
    \'post_type\'       => \'post\',
    \'post_mime_type\'  => \'\',
    \'post_parent\'     => \'\',
    \'post_status\'     => \'publish\',
    \'suppress_filters\' => true );
如果您已经修改了默认查询,那么应该使用默认WordPress循环。这样做:

// this will iterate posts already selected by WordPress with its default query (modified with your filter)
while ( have_posts() ) {
    the_post();

    echo "<li><a href=\'". the_permalink() ."\'>". the_title()."</a></li>";
}

SO网友:rfrq

因为我知道初学者很难理解获取帖子的不同方式,也许你应该尝试一个简单的例子。如果你访问你的博客,WordPress会查找索引。php,通常包含以下代码:

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

    <?php /* Start the Loop */ ?>
    <?php while ( have_posts() ) : the_post(); ?>

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

    <?php endwhile; ?>

<?php endif; ?>
默认情况下,这段代码将检索您最近的10篇帖子,您可以在Settings > Reading: http://www.pixelfrau.com/wp-content/uploads/2012/09/wordpress_reading_settings_01.png .

现在,您可以忽略给定的代码,并在其下面尝试一些全新的内容。但是如上所述,您可以非常轻松地更改标准查询pre_get_posts. 我给你的例子中有一个小的拼写错误,你必须改变parentpost_parent. 现在,如果在frontpage/home上使用functions.php:

function show_all_pages_on_index( $query ) { 
    if ( (is_front_page() || is_home()) && $query->is_main_query() ) {
        $query->set(\'post_type\', \'page\'); // ignore to show posttype "posts" which was set under Setting > Reading
        $query->set(\'post_parent\', \'0\');
        $query->set(\'post_status\', \'publish\');
        $query->set(\'orderby\', \'menu_order\');
        $query->set(\'order\', \'ASC\');
        $query->set( \'posts_per_page\', -1 ); // ignore limit which was set under Setting > Reading
    }
}
add_action( \'pre_get_posts\', \'show_all_pages_on_index\' );
现在你应该看到所有的根页面,而不是10篇最新的帖子。因此,没有必要使用get_posts, 因为你的帖子已经在那里了。您可以开始处理模板文件,创建新的查询,就像您在显示子页面时所做的那样。或者您可以使用functions.php 再次显示子页面,始终直接连接到根页面的内容下the_content:

function show_subpages_after_content( $content ) {
    // vars
    $output = \'\';
    $subpages = \'\';
    /* SUBPAGES  */
    // args
    $args_subpages = array(
            \'post_type\' => \'page\',
            \'post_parent\' => get_the_ID()            
     );
    // get posts
    $subpages_query = new WP_Query($args_subpages);
    if ($subpages_query->have_posts()) {
            $subpages = \'<ul class="subpages">\';
            while ($subpages_query->have_posts()) {
                    $subpages_query->the_post();
                    $subpages .= \'<li>\';
                    $subpages .= get_the_title();
                    $subpages .= \'</li>\';
                    }                    
            $subpages .= \'</ul>\';
    }
    wp_reset_postdata();
    // output - 1st the unedited content, 2nd all subpages beloging to this post
    $output .= $content . $subpages;
    //return
    return $output;
}
add_action( \'the_content\', \'show_subpages_after_content\' );
哪种方式最好取决于你的网站有多复杂,以及你必须处理多少不同的内容元素。最后,我希望这有助于作为起点。

结束

相关推荐