WordPress get_posts:如何使用此有用的PHP函数构建帖子列表

WordPress get_posts是一个强大的功能,允许开发人员从WordPress数据库中检索内容。您可以最详细地指定要查找的帖子,页面和自定义帖子类型,获取自定义结果集,然后过滤和订购项目(如PHP / MySQL忍者)。

但是,如果您不是PHP专业人员,请不要害怕。您只需要一点点PHP知识,即可创建自定义的帖子列表以显示在您的网站上,因为get_posts函数保留了一系列参数,可用于构建简单或高级查询。

使用WordPress的get_posts分为两个步骤:

厌倦了缓慢的WordPress托管和低于标准的支持?我们在Kinsta做不同的事情。
        
          查看我们的托管计划

  • 首先,您必须构建自定义查询。实际上,它看起来不会像MySQL查询,您也不会编写任何SELECT语句。您只需要定义一个参数数组并将其传递给get_posts函数。 WordPress将该数组转换为真实且安全的MySQL查询,并针对数据库运行它,并返回帖子数组。
  • 其次,您必须使用foreach循环遍历get_posts返回的结果集。

就是说,在本文中,我们将首先深入探讨上述关键概念,特别是get_posts的工作方式,如何构建自定义查询以及如何在前端站点上显示数据。
然后,我将提供一个包含示例代码的真实示例,您可以在过渡环境中抓取,编辑和使用这些代码以进行测试和开发。

注意:我们通常区分帖子,页面和自定义帖子类型。在本文中,我们对常规博客文章以及页面和自定义文章类型使用“文章”一词。所有这些帖子类型都存储在数据库的“ wp_posts”表中。帖子类型之间的主要区别在于“ post_type”字段的值。从开发人员的角度来看,帖子,页面和自定义帖子类型都是帖子。

  • WordPress get_posts函数简介
  • 如何使用get_posts参数构建查询
  • 如何显示get_posts数据
  • 实际示例:显示带有自定义简码的高度自定义的帖子列表

WordPress get_posts函数简介

食典对get_posts函数的描述如下:

检索一系列最新帖子,或与给定条件匹配的帖子。

我们可以这样使用get_posts:

$ args =数组(
'numberposts'=> 20,
'类别'=> 4
);
$ my_posts = get_posts($ args);

if(!empty($ my_posts)){
$输出='

    ';
    foreach($ my_posts as $ p){
    $ output。='

  • ID ) 。 “ https://kinsta.com/“>”
    。 $ p-> post_title。 '
  • ';
    }
    $ output。='

      ';
      }

      上面的函数检索指定类别中的最新20篇博客文章(默认情况下,“ post_type”为“ post”)并返回$ post对象数组。您可以遍历数组以在屏幕上显示帖子。很简单,对吧?

      get_posts使用WP_Query检索帖子项目,并且保留WP_Query中可用的相同参数的数组(除少数例外)。因此,我们有大量的变量列表,可用于构建自定义查询。这些参数分为以下15个类别:

      • 作者参数
      • 类别参数
      • 标签参数
      • 分类参数
      • 搜索参数
      • 帖子和页面参数
      • 密码参数
      • 帖子类型参数
      • Order&Orderby参数
      • 日期参数
      • 自定义字段(后置元数据)参数
      • 权限参数
      • MIME类型参数
      • 缓存参数
      • 返回字段参数

      快速浏览上面的列表可以使您了解可以针对WordPress数据库构建和运行的各种自定义查询。因此,让我们更深入地研究查询参数并开始构建我们的帖子列表。

      如何使用WordPress get_posts建立查询

      每种参数类别都涉及相同的信息。例如,我们可以构建一个查询来检索指定作者或排除指定作者的帖子,并按ID或nicename定义作者。同样,我们可以构建查询以按类别,标签,分类法,日期,自定义字段等获取帖子。

      如何使用参数构建简单查询

      许多参数可以以非常相似的方式使用,无论它们属于什么类别。例如,以下参数允许按帖子作者查询数据库:

      • author(int)–作者ID

      • author_name(字符串)–作者的user_nicename

      • author__in(数组)–多个作者ID的数组

      • author__not_in(数组)–要从结果集中排除的多个作者ID组成的数组

      我们如何使用这些参数?

      在下面的示例中,参数'author'指定我们需要ID = 1的作者撰写的最新博客文章:

      $ my_posts = get_posts(array('author'=> 1));

      相同的“作者”参数允许以不同的方式查询数据库:

      //返回特定作者的帖子数组
      $ my_posts = get_posts(array('author'=>'1,5,12'));
      //返回不包含指定作者的帖子数组
      $ my_posts = get_posts(array('author'=> -1));

      因此,根据参数的值,您将获得一个结果集,其中包含来自单个作者(整数),多个作者(逗号分隔值的列表)或排除一个作者(负值)的帖子。

      其他参数提供了额外的灵活性。例如,对get_posts的以下调用返回多个作者的最新博客文章的数组:

      //返回多个作者的帖子数组
      $ my_posts = get_posts(array('author__in'=> array(1,5,12)));

      我们还可以排除多个作者:

      //返回多个作者的帖子数组
      $ my_posts = get_posts(array('author__not_in'=> array(1,5,12)));

      同样,我们可以使用类别参数,标签参数,后置类型参数,但有一些特定的区别。作为示例,请参阅类别参数:

      • 猫(int)

      • category_name(字符串)

      • 类别__和(数组)

      • category__in(数组)

      • category__not_in(数组)

      无论如何,并非所有参数都像这些参数一样容易使用。此外,我们可以在单个查询中使用类别参数,帖子类型参数,mime类型参数等。这意味着我们可以对结果集中的项目进行精细控制,并且可以基于帖子类型,自定义分类法和自定义字段来构建更高级的查询。

      因此,让我们深入研究吧!

      如何在WordPress中建立高级查询

      让我们通过基于自定义帖子类型和自定义分类法的更高级查询向前迈进。假设您有以下帖子类型:

      名称:书
      分类名称:book_category,book_author
      支持:标题,编辑器,缩略图,摘录,自定义字段

      自定义帖子类型和自定义分类法

      假设您需要指定book_category自定义分类法中最新书籍的列表。这是参数数组:

      $ args =数组(
      'post_type'=>'book',
      'tax_query'=>数组(
      数组(
      '分类法'=>'book_category',
      'field'=>'slug',
      '条款'=>'科幻'

      ),
      );

      上面的参数只是告诉WordPress检索“ sci-fi”“ book_category”中的所有图书。

      'tax_query'参数采用参数数组的数组(即数组的数组)。这些嵌套的数组允许基于多个分类法构建非常复杂的查询,如下例所示:

      $ args =数组(
      'numberposts'=> 10,
      'post_type'=>'book',
      'relation'=>'AND',
      'tax_query'=>数组(
      数组(
      '分类法'=>'book_category',
      'field'=>'slug',
      '条款'=>'科幻'
      ),
      数组(
      '分类法'=>'book_author',
      'field'=>'term_id',
      '条款'=> 22


      );

      这些参数使我们能够检索ID为#22的'book_author'编写的'sci-fi''book_category'中最新的10种'book'帖子类型的列表。 'relation'参数设置'tax_query'中列出的每个分类法之间的逻辑关系。上面我们将其值设置为AND,因为我们需要检索所有属于“科幻”类别且由作者#22撰写的书籍。

      如何使用自定义字段参数构建元查询

      有时,您可能需要根据特定的自定义字段键和/或值来构建帖子列表。

      $ args =数组(
      'meta_key'=>'封面',
      'meta_value'=>'平装本',
      'meta_compare'=>'='
      );

      这些参数使我们能够通过自定义字段键和值检索所有帖子。 “ meta_compare”设置测试“ meta_value”参数值所需的运算符。这里的“ meta_value”是“ =”,这也是默认值。

      可用值是'=','!=','>','> =','<','<=','LIKE','NOT LIKE','IN','NOT IN','BETWEEN ”,“不存在”,“不存在”,“ REGEXP”,“不REGEXP”或“ RLIKE”。

      这是一个非常简单的示例,但是我们可以构建更高级的查询。在下一个示例中,我们查询数据库以获取2010年以后发行的幻想书:

      $ args =数组(
      'post_type'=>'book',
      'meta_key'=>'year_published',
      'meta_value_num'=> 2010,
      'meta_compare'=>'>',
      'tax_query'=>数组(
      数组(
      '分类法'=>'book_category',
      'field'=>'slug“ https://kinsta.com/” terms“ =>'fantasy'


      );

      我们可以走得更远。在下一个示例中,我们将带有自定义分类法和两个自定义字段的帖子类型混合在一起:

      $ args =数组(
      'post_type'=>'book',
      'tax_query'=>数组(
      数组(
      '分类法'=>'book_category',
      'field'=>'slug“ https://kinsta.com/” terms“ => array('fantasy')

      ),
      'meta_query'=>数组(
      'relation'=>'AND',
      数组(
      'key'=>'year_published',
      '值'=> 2010,
      '类型'=>'数字',
      '比较'=>'>',
      ),
      数组(
      '键'=>'价格',
      '值'=> array(10,25),
      '类型'=>'数字',
      '比较'=>'BETWEEN',


      );

      在这里,我们设置了一个参数数组,以检索2010年以后发行的价格在10美元和25美元之间的奇幻书籍的列表。

      您可以看到'meta_query'参数的工作原理与'tax_query'参数非常相似。它保留了一个数组数组,使我们能够基于多个元键/值对建立高级查询。有关查询参数的完整列表和大量示例,请参见WP_Query文档。

      为什么get_posts仅限于5个WordPress帖子?

      get_posts函数采用与WP_Query :: parse_query()相同的参数(请参见食典),但是某些特定参数使其工作原理与WP_Query对象略有不同。

      也许您没有在查询中使用'numberposts'参数,并且想知道为什么列表中仅显示5个项目。

      默认情况下,您在“设置”→“阅读管理员”页面中设置的帖子数决定了WordPress查询要检索的帖子数。无论如何,如果您未为'numberposts'或'posts_per_page'指定自定义值,则get_posts将返回不同数量的帖子。

      • “ numberposts”是要检索的帖子总数。它是WP_Query中“ posts_per_page”的别名,但两者之间存在差异:默认情况下,使用get_posts时要检索的帖子数为5,而WP_Query中的“ posts_per_page”默认为每页您的帖子数WordPress博客。您可以通过在参数数组中为'numberposts'或'posts_per_page'设置自定义值来覆盖默认值。

      除了“ numberposts”以外,以下参数是get_posts的特定参数:

      • “类别”是用逗号分隔的类别ID列表。它是WP_Query中“ cat”参数的别名。

      • “包含”是帖子ID的逗号分隔列表。这是WP_Query中“ post__in”参数的别名。

      • “排除”是帖子ID的逗号分隔列表。

      • 'suppress_filters'指定是否抑制过滤器。此参数在get_posts中默认为true,而在WP_Query中默认为false(请参见Track)。

      get_posts函数在wp-includes / post.php中定义。您可以通过在Track(WordPress 5.2)或本地WordPress安装中检查源代码来深入了解get_posts的工作方式。

      订购项目

      'orderby'和'order'对结果集中的项目进行排序。您可以按“ ID”,“作者”,“标题”,“名称”,“类型”,“日期”,“修改”,“父母”,“ rand”,“ comment_count”等多种方式对帖子进行分类,以升序或降序排列。

      如果您有一个简单的查询,则只需为“ order”和“ orderby”设置一个值。在以下示例中,帖子按帖子名称按升序排序:

      $ args =数组(
      '作者'=>'1,5,12',
      'orderby'=>'名称',
      '订单'=>'ASC'
      );

      这很简单。但是,如果您有高级查询怎么办?即:我们可以在高级元查询中按一个或多个自定义字段值对项目进行排序吗?

      WordPress 4.0和WordPress 4.2对'orderby'和'meta_query'参数进行了重要的改进。现在,我们有了一种新语法,可以按元查询的特定子句进行排序。由于有了新的语法,我们可以使用索引从“ orderby”参数创建对元查询特定子句的引用。

      由于有了这些改进,以上示例中的元查询可以编写如下:

      借助WordPress,我们的流量增长了1,187%。我们将向您展示方法。
      加入20,000多个其他人,这些人每周都会收到有关WordPress内部技巧的新闻!

                现在订阅
              
              
                
                  
                  成功!感谢您的订阅

      您将在一周内收到下一期的Kinsta新闻通讯。

      订阅Kinsta新闻通讯
              

        
          
        

          订阅
        

        
          
        
          
            
              
            
            
            我同意条款和条件以及隐私政策
          
        

        

            

        
        
      $ args =数组(
      'meta_query'=>数组(
      'relation'=>'AND',
      'year_clause'=>数组(
      'key'=>'year_published',
      '值'=> 2010,
      '类型'=>'数字',
      '比较'=>'>',
      ),
      'price_clause'=>数组(
      '键'=>'价格',
      '值'=> array(10,25),
      '类型'=>'数字',
      '比较'=>'BETWEEN',

      ),
      'orderby'=>'price_clause',
      );

      在上面的示例中,我们按“ price_clause”对元素进行了排序。

      我们可以做的更多。从WordPress 4.0开始,我们可以将元查询索引数组而不是单个索引传递给get_posts,如以下示例所示:

      $ args =数组(
      'meta_query'=>数组(
      'relation'=>'AND',
      'year_clause'=>数组(
      'key'=>'year_published',
      '值'=> 2010,
      '类型'=>'数字',
      '比较'=>'>',
      ),
      'price_clause'=>数组(
      '键'=>'价格',
      '值'=> array(10,25),
      '类型'=>'数字',
      '比较'=>'BETWEEN',

      ),
      'orderby'=> array('price_clause'=>'ASC','year_clause'=>'DESC'),
      );

      恭喜,您已经建立了高级的元查询,并首先按'price_clause'升序对结果进行排序,然后按'year_clause'降序对结果进行排序。

      请参阅食典中的排序选项的完整列表。

      现在是时候在首页上显示数据了。

      如何显示get_posts返回的数据

      WordPressget_posts返回一个WP_Post对象数组,使我们可以访问存储在wp_posts数据库表中的每个选定帖子的多个变量:

      • ID
      • post_author
      • post_name
      • post_type
      • 帖子标题
      • 发布日期
      • post_date_gmt
      • post_content
      • 摘录后
      • 后状态
      • comment_status
      • ping_status
      • post_password
      • 后父母
      • 后修改
      • post_modified_gmt
      • comment_count
      • menu_order

      WordPress get_posts:wp_posts表

      phpMyAdmin中的wp_posts表结构

      您可以通过如下所示的foreach周期轻松访问这些数据:

      $ custom_posts = get_posts($ args);

      if(!empty($ custom_posts)){
      $输出='

      ';
      }

      返回$ output? '抱歉。没有符合您条件的帖子!';

      如果get_posts找到至少一个帖子,它将返回一组我们可以遍历的项目以显示帖子标题和原始帖子的链接。由于没有相应的WP_Post变量,我们使用了get_permalink函数来检索发布的永久链接。

      那很容易,但是我们如何实现该代码并使用WordPress get_posts构建自定义帖子列表?

      您可以通过几种方式在页面上显示帖子列表。

      • 您可以通过编辑子主题的页面模板将它们包括在页面上的任何位置。
      • 您可以将它们包括在侧边栏小部件中。
      • 您可以使用自定义的简码将它们添加到帖子的内容中

      实际示例:如何显示带有短代码的自定义项目列表

      我将向您展示如何构建可包含在内容中的快捷代码。无论如何,我不会深入研究简码,因为我们在上一篇博客文章中已经介绍了该主题。

      首先,在本地WordPress安装的wp-content / plugins文件夹中或在暂存环境中创建一个新目录。在此示例中,我将目录命名为kinsta-shortcodes。

      在wp-content / plugins / kinsta-shortcodes /中,创建一个与新目录同名的.php文件:kinsta-shortcodes.php。

      在您喜欢的文本编辑器中打开新文件,并包含以下标题:

      <?php
      / **
       * @package Kinsta_shortcodes
       * @版本1.0
       * /
      / *
      插件名称:Kinsta shortcodes
      插件URI:http://wordpress.org/extend/plugins/#
      说明:这是一个示例插件
      作者:您的名字
      版本:1.0
      作者URI:https://yourwebsite.com/
      * /

      现在,我们有了一个全新的插件,但仍然无能为力。浏览到WordPress信息中心中的插件管理屏幕,并激活新插件,以确保在wp-config.php文件中将WP_DEBUG设置为true。

      现在,您的沙箱已准备好进行黑客攻击。下一步是为自定义短代码注册一个钩子:

      / **
       *添加一个用于简码标签的钩子
       * /
      函数kinsta_shortcodes_init(){
      add_shortcode('kinsta_get_posts','kinsta_get_posts_cb');
      }
      add_action('init','kinsta_shortcodes_init');

      kinsta_get_posts是简称,而kinsta_get_posts_cb是以下定义的回调:

      / **
       *注册一个简码
       *
       * @param array $ atts简码属性数组
       * /
      函数kinsta_get_posts_cb($ atts){

      //安全地提取自定义参数并设置默认值
      提取(shortcode_atts(
      数组(
      'numberposts'=> 3,
      'post_type'=>'post',
      'book_category'=>'幻想',
      'year_published'=> 1900,
      'price_min'=> 0,
      'price_max'=> 50
      ),
      $ atts,
      'kinsta_get_posts'
      ));

      //定义查询参数数组
      $ args =数组(
      'numberposts'=> $ numberposts,
      'post_type'=> $ post_type,
      'tax_query'=>数组(
      数组(
      '分类法'=>'book_category',
      'field'=>'slug',
      'terms'=> $ book_category,

      ),
      'meta_query'=>数组(
      'relation'=>'AND',
      'year_clause'=>数组(
      'key'=>'year_published',
      'value'=> $ year_published,
      '类型'=>'数字',
      '比较'=>'>',
      ),
      'price_clause'=>数组(
      '键'=>'价格',
      '值'=>数组($ price_min,$ price_max),
      '类型'=>'数字',
      '比较'=>'BETWEEN',

      ),
      'orderby'=>数组('price_clause'=>'ASC')
      );

      $ custom_posts = get_posts($ args);

      if(!empty($ custom_posts)){
      $输出='

      ';
      }

      返回$ output? '抱歉。没有符合您条件的帖子!';

      我们设置了六个短代码属性,用于定义参数数组,这些参数最终传递给WordPressget_posts函数。如果$ custom_posts不为空,则foreach循环将生成无序列表的HTML。

      现在,您和您的博客作者可以使用类似于以下内容的简码包含帖子列表:

      (kinsta_get_posts post_type =“ book” book_category =“科幻” numberposts =“ 4” price_min = 1 price_max = 250)

      当然,您可以根据需要更改参数数组,并在开发网站的任何帖子或页面上运行测试。

      WordPress get_posts示例

      使用get_posts函数构建的高级帖子列表

      是否需要在WordPress中创建帖子,页面或自定义帖子类型的列表?了解如何使用get_posts函数来做到这一点! ??‍??‍?

      点击鸣叫

      摘要

      WordPress的get_posts功能强大,可让开发人员在WordPress网站前端的任何位置包含帖子列表。它使用WP_Query,但是使用起来更简单,并且只需要帖子列表时,它比WP_Query更可取。无论如何,当您需要在循环中显示帖子时,建议直接引用WP_Query。

      因此,构建您的列表,测试您的代码,然后确定可以正常工作,然后(然后才)将其推送到您的实时网站(但首先运行备份)。

      现在,我们希望收到您的来信。您对WordPress get_posts函数有什么经验?您有任何用例可以与我们分享吗?在下面的评论中这样做!

      0分享

      .essb_links .essb_links_list li a {
        margin-top:0px;
      }
      @media only屏幕和(最小宽度:64em){
        .container–narrow.pb–60,
        .knowledgebase .user-content {
          职位:相对
        }
        .widget-share {
          位置:绝对;
          左:-200px;
          顶部:0px;
          高度:100%;
          宽度:200像素;
          框大小:border-box;
        }
        .widget-share-aligner {
          宽度:200像素;
          padding-right:62px;
          框大小:border-box;
        }
        .widget-share-inner {
          padding-bottom:62px;
        }
        .knowledgebase .user-content .widget-share-inner {
          padding-top:0;
        }
        .widget-share .amount {
          显示:flex;
          align-items:居中;
          证明内容:flex-end;
          宽度:100%;
          右边距:11px;
          font-size:14px;
          font-weight:500;
          底边距:10px;
        }
        .widget-share .amount svg {
          右边距:8px;
          margin-left:10px;
        }
        .essb_links .essb_links_list {
          flex-direction:列;
          align-items:flex-end;
        }
        .essb_links .essb_links_list li {
          显示:块;
          margin-bottom:5px!important;
        }
        .widget-share__total {
          margin-bottom:0px!重要;
        }
        .widget-share__total .heading–small {
          颜色:#999999;
          font-size:14px;
          字体粗细:300;
        }
        .essb-total-value {
          margin-right:4px;
        }

      }
      .essb_links {
        保证金:0px;
        填充:0px;
      }
      .essb_counter_right {
        显示:无!重要;
      }
      .essb_links.essb_template_circles-retina .essb_link_hackernews一个,
      .essb_links.essb_template_circles-retina .essb_link_reddit a,
      .essb_links.essb_template_circles-retina .essb_link_mail a,
      .essb_links.essb_template_circles-retina .essb_link_mwp a,
      .essb_links.essb_template_circles-retina .essb_link_buffer a,
      .essb_links.essb_template_circles-retina .essb_link_linkedin a,
      .essb_links.essb_template_circles-retina .essb_link_facebook a,
      .essb_links.essb_template_circles-retina .essb_link_twitter a
       {
        颜色:#43414e!important;
        背景:#f3f3f6!important;
      }

      .essb_links.essb_template_circles-retina li a:focus,.essb_links.essb_template_circles-retina li a:hover {
        border-color:#fff!important;
        背景:#43414e!重要;
      }

      .essb_links.essb_template_circles-retina a {
        border-color:#f3f3f6!important;
        背景:#f3f3f6;
      }
      .essb_links .essb_icon:之前{
        font-size:15px!important;
        顶部:8px;
        左:9px;
      }
      .essb_links .essb_icon {
        宽度:32px;
        高度:32px;
      }
      .essb_links.essb_counter_modern_right .essb_counter_right {
        背景:#f3f3f6!important;
      }
      @media only屏幕和(最大宽度:63.999em){
        .widget-share-aligner {
          位置:相对!重要;
          top:0!重要;
        }
        .essb_links .essb_links_list li {
          margin-right:8px!important;
        }
      }

相关文章