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;
        }
      }

相關文章