既然我们已经了解了有关WP_Query
类的几乎所有知识,那么现在该尝试一些示例了。 在这一部分中,我们将在10种不同的场景下进行工作,以利用WP_Query
类和相关功能。
这将是一个有趣的练习,我希望它将同样具有教育意义。 让我们开始!
使用WP_Query创建循环的快速提醒
只是为了使本文与“掌握WP_Query”系列分开理解,我应该做一个纳米教程,介绍如何使用WP_Query
类创建WordPress循环。
实际上,这与创建常规循环没有什么不同。 一个典型的WordPress循环如下所示:
<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Post data goes here.
}
}
?>
并且使用WP_Query
类创建循环只有几个区别:
<?php
$args = array(
'category_name' => 'news',
'posts_per_page' => 3
);
$my_query = new WP_Query( $args );
if ( $my_query->have_posts() ) {
while ( $my_query->have_posts() ) {
$my_query->the_post();
// Post data goes here.
}
}
// Reset the `$post` data to the current post in main query.
wp_reset_postdata();
?>
让我们看看两者之间的区别:
- 我们为
WP_Query
实例设置了一些参数, - 我们实例化了
WP_Query
类, - 我们在
have_posts()
和the_post()
函数的开头添加了$my_query->
(因此它们现在是WP_Query
类的方法), - 然后我们重置
$post
的数据,以便它可以返回到主查询。
现在我们知道了如何使用WP_Query
创建循环以及常规循环和WP_Query
创建的循环之间的WP_Query
。 我们不会在每个示例中都创建循环(为了使本教程简短易懂,因此您可以在需要使用以下示例创建循环的情况下参考本节。
例1:今年作者的帖子
假设您要在特殊的“今年的作者帖子”部分中列出当年撰写的特定作者的帖子。 两个WP_Query
参数的简单组合就足够了:
<?php
// Get the year we're in.
$current_year = date( 'Y' );
// Setup arguments.
$args = array(
// Get the author with the nicename "john".
'author' => 'john',
// Get his posts from this year.
'year' => $current_year
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
?>
循环传递此查询,您一切顺利!
示例#2:“该类别的最新帖子”(当前帖子除外)
假设您要在单个帖子页面的每个帖子下创建一个循环,并列出该帖子所属类别中的最新帖子。当然,您必须排除当前帖子,以防它可能是最新帖子之一该类别的帖子。 这是使用'cat'
和'post__not_in'
参数创建查询的方式:
<?php
// Get the current post id.
$current_post_id = get_the_ID();
// Get the current post's category (first one if there's more than one).
$current_post_cats = get_the_category();
$current_post_first_cat_id = $current_post_cats[ 0 ]->term_id;
// Setup arguments.
$args = array(
// Get category's posts.
'cat' => $current_post_first_cat_id,
// Exclude current post.
'post__not_in' => array( $current_post_id )
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
?>
对于循环,我建议创建三或四列,并在帖子标题上方添加帖子缩略图。 在帖子下方和评论部分之前,它将看起来非常不错。
例3:“最流行的帖子”按评论数排序
WordPress没有内置的“后视图计数”系统,并且提供此功能的插件以降低网站速度而闻名(因为在每个后视图中,这些插件一遍又一遍地写入数据库以记录视图数)。 但是,还有另一种衡量标准来确定哪些帖子最“受欢迎”:对评论进行计数。 而且与视图计数不同,注释计数已经在数据库中WP_Query
类使按注释计数对帖子进行排序变得非常容易:
<?php
// Setup arguments.
$args = array(
// Order by comment count.
'orderby' => 'comment_count'
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
?>
看看这有多容易? 现在,假设通过运行此查询的循环(“评论最多的帖子”页面)创建自定义页面模板。
例4:简单的滑块设置
使用WordPress建立公司网站,作品集或网络杂志时,滑块已成为“必备”的工业标准。 我并不真正喜欢滑块(我认为这是糟糕的UX),但网络似乎很喜欢它,因此我不能在为客户创建网站时对客户说不。 如果他们想要滑块,我可以使用WP_Query
类进行简单查询:
<?php
// Setup arguments.
$args = array(
// Get the "slider" post type.
'post_type' => 'slider',
// Get a specific slider category.
'category_name' => 'home-slides',
// Get all slides and don't paginate.
'nopaging' => true
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
?>
'cat'
参数可用于检索不同类别的幻灯片,因此您可以分离幻灯片组并在多个页面上使用多个滑块。 如果您仅要在网站中使用一个滑块,则可以删除该行,此举很不错。
示例5:侧边栏中的随机引号
如果您热衷于文学或宗教,则可能需要在侧边栏中添加一些自己喜欢的报价-如果您有目的地使用该区域,这不会浪费空间。 因此,如果您要在每个页面视图的侧边栏中列出随机引号,则可以使用以下代码段创建帖子类型,并使用以下查询在侧边栏中创建循环:
<?php
/*
* Create new post type called "Quotes"
* (refer to the `register_post_type` function to
* learn more about creating custom post types).
*/
function quote_post_type() {
$args = array(
'label' => 'Quotes',
'public' => true
);
register_post_type( 'quotes', $args );
}
add_action( 'init', 'quote_post_type' );
// Setup arguments.
$args = array(
// Get the "quotes" psot type.
'post_type' => 'quotes',
// Randomize the order.
'orderby' => 'rand',
// Get only one item.
'posts_per_page' => 1,
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
?>
一个简单而优雅的解决方案。
例6:在价格范围之间列出产品
我在Scribu.net上找到了此示例,我必须说,这可能是本教程中最好的WP_Query
技巧。 它也比其他方法更具技术性,因为在这种情况下可以将其应用于WordPress驱动的电子商务网站。
如果要列出自定义“产品”帖子类型的项目并使用“价格”自定义字段过滤结果,请使用以下代码段:
<?php
// Source: http://scribu.net/wordpress/advanced-metadata-queries.html
// Setup arguments.
$args = array(
// Get the "product" post type.
'post_type' => 'product',
// Setup the "meta query".
'meta_query' => array(
array(
// Get the "price" custom field.
'key' => 'price',
// Set the price values.
'value' => array( 100, 200 ),
// Set the compare operator.
'compare' => 'BETWEEN',
// Only look at numeric fields.
'type' => 'numeric',
)
)
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
?>
对Silviu-Cristian Burca表示极大的敬意!
示例#7:在帖子内嵌入帖子的简码
这是一个有趣的练习-我们也可以使用Shortcode API! 在此示例中,我们将创建一个可以将帖子嵌入到帖子中的简码。 (在命名短代码[postception]
我几乎不[postception]
自己。)在下面的代码片段中,我们创建了一个短代码函数,该函数可让我们嵌入帖子(或任何自定义帖子类型),并让我们选择显示完整帖子还是仅显示完整帖子摘录:
<?php
/*
* Usage:
*
* [embed_post slug="my-post"]
* [embed_post slug="my-post" full="false"]
* [embed_post type="movie" slug="inception"]
*/
function tutsplus_embedded_post_shortcode( $attributes ) {
// Extract shortcode attributes.
extract(
shortcode_atts(
array(
'type' => 'post',
'slug' => '',
'full' => true
),
$attributes
)
);
// Setup arguments.
$args = array(
// Get post type ("post" by default).
'post_type' => $type,
// Get post by slug.
'name' => $slug
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
// Check that we have query results.
if ( $my_query->have_posts() ) {
// Begin generating markup.
$output = '<section class="embedded-post">';
// Start looping over the query results.
while ( $my_query->have_posts() ) {
$my_query->the_post();
// Add title to output.
$output .= '<h2 class="embedded-post-title">';
$output .= get_the_title();
$output .= '</h2>';
// Get full post if `$full` is true, otherwise, show the get excerpt
if ( 'true' === $full ) {
// Add full content to output.
$output .= '<div class="embedded-post-content">';
$output .= get_the_content();
$output .= '</div>';
} else {
// Add excerpt to output.
$output .= '<div class="embedded-post-excerpt">';
$output .= get_the_excerpt();
$output .= '… <a href="' . get_permalink() . '">' . __( 'See full post', 'tutsplus' ) . ' »</a>';
$output .= '</div>';
}
}
// End generating markup.
$output .= '</section>';
} else {
// Output message to let user know that no posts were found.
$output = '<section class="embedded-post-error">';
$output .= '<p>' . __( 'No posts found.', 'tutsplus' ) . '</p>';
$output .= '</section>';
}
wp_reset_postdata();
return $output;
}
add_shortcode( 'embed_post', 'tutsplus_embedded_post_shortcode' );
?>
示例#8:当前计划的帖子列表(带有可选节选)
这是一个主意:为什么不向访问者显示即将发布的帖子的“偷窥”? 您可以使用以下功能在标题之后列出您计划的帖子,带或不带节选:
<?php
/*
* Usage with Excerpts:
*
* <?php echo tutsplus_show_drafts(); ?>
*
* Usage without Excerpts:
*
* <?php echo tutsplus_show_drafts( false ); ?>
*/
function tutsplus_show_drafts( $show_excerpts = true ) {
// Setup arguments.
$args = array(
'post_status' => 'future',
'nopaging' => true
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
// Check that we have query results.
if ( $my_query->have_posts() ) {
// Begin generating markup.
$output = '<section class="pending-posts">';
// Start looping over the query results.
while ( $my_query->have_posts() ) {
$my_query->the_post();
// Output draft post title and excerpt (if enabled).
$output .= '<div class="pending">';
$output .= '<h3 class="pending-title">' . get_the_title() . '</h3>';
$output .= get_the_title();
$output .= '</h3>';
if ( $show_excerpts ) {
$output .= '<div class="pending-excerpt">';
$output .= get_the_excerpt();
$output .= '</div>';
}
$output .= '</div>';
}
// End generating markup.
$output .= '</section>';
} else {
// Let user know that nothing was found.
$output = '<section class="drafts-error">';
$output .= '<p>' . __( 'Nothing found', 'tutsplus' ) . '</p>';
$output .= '</section>';
}
wp_reset_postdata();
return $output;
}
?>
示例#9:“今天从一年前发布”
如果您的博客超过一年,并且您的内容是永恒的(这意味着2015年和2025年的人都将找到相关的文章),则添加“今天前一年的帖子”部分可能会提高页面浏览量。 这是您的操作方式:
<?php
// Setup arguments.
$args = array(
// Day (1 - 31).
'day' => date( 'j' ),
// Month (1 - 12).
'monthnum' => date( 'n' ),
// Year (minus 1).
'year' => date( 'Y' ) - 1,
// Show only one post.
'posts_per_page' => 1
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
?>
使用此查询来构建一个循环,以显示过去一年中的单个帖子。
例10:显示当前页面的子代
除了子页面标题之外,您没有其他内容可放入“服务”,“我们的作品”或“我的投资组合”页面中吗? 也许是介绍性段落,但您是对的,这些页面注定是“占位符”。 不过,将子页面放在其中还是个好主意-可能是下面带有方形缩略图和标题的网格。 让我们看看在创建这样的页面模板时应该使用哪个查询:
<?php
$current_page_id = get_the_ID();
// Setup arguments.
$args = array(
// Get children of current page.
'parent' => $current_page_id,
// Disable pagination.
'nopaging' => true
);
// Instantiate new query instance.
$my_query = new WP_Query( $args );
?>
包起来
我希望您能像准备它们时一样喜欢这些示例。 我特别注意提供各种示例,既有趣又激发您的创造力。
如果您在阅读这些示例时想到了更好的示例,或者有疑问,请随时在下面发表评论。 而且,如果您喜欢这篇文章,请不要忘记与您的朋友分享!
在下一部分中,我们将讨论WP_User_Query
的姐妹类之一WP_Query
。 回头见!
翻译自: https://code.tutsplus.com/tutorials/mastering-wp_query-10-useful-examples--cms-22980