掌握WP_Query:10个有用的示例

既然我们已经了解了有关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 .= '&hellip; <a href="' . get_permalink() . '">' . __( 'See full post', 'tutsplus' ) . ' &raquo;</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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值