昨天,我问如何最好地将所有现有页面及其内容加载到首页,以创建单页布局。(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,这几乎意味着您可以为子页面创建不同的模板,但您需要创建它们,以便它们实际适合单个页面布局。
感谢所有贡献者:)
最合适的回答,由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
. 我给你的例子中有一个小的拼写错误,你必须改变parent
到post_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\' );
哪种方式最好取决于你的网站有多复杂,以及你必须处理多少不同的内容元素。最后,我希望这有助于作为起点。