您需要了解WordPress Meta_Query的一切

您需要了解WordPress Meta_Query的一切

WordPress 中最強大的工具之一就是為文章新增自定義欄位的功能。許多開發人員使用 Advanced Custom Fields 或自定義文章元欄位。您可以使用 WordPress 內建的元查詢功能來查詢 WordPress 網站上的自定義欄位。

在本篇博文中,我們將介紹如何使用 WordPress 中的 meta_query 函式按自定義欄位查詢文章。這對擁有大量自定義功能的網站很有幫助。請記住,您需要熟悉 PHP。

通過元值查詢文章

使用自定義欄位查詢文章最常用的方法可能就是針對一個特定的元值。

例如,假設我們有一個網站,其中的文章有一個自定義欄位,用於確定文章是否是 “featured” 文章。這在 WordPress 網站製作特色版塊時很常見。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$meta_query_args = array(
'meta_query' => array(
array(
'key' => 'featured_post',
'value' => 'yes',
'compare' => '='
)
)
);
$meta_query = new WP_Query( $meta_query_args );
<?php $meta_query_args = array( 'meta_query' => array( array( 'key' => 'featured_post', 'value' => 'yes', 'compare' => '=' ) ) ); $meta_query = new WP_Query( $meta_query_args );
<?php
$meta_query_args = array(
 'meta_query' => array(
 array(
 'key' => 'featured_post',
 'value' => 'yes',
 'compare' => '='
 )
 )
);
 
$meta_query = new WP_Query( $meta_query_args );

當然,上述程式碼會根據您的欄位標題和 postmeta 關鍵字而有所不同,但 meta_query 引數中的 “key” 是自定義欄位的名稱。而 “value” 則是我們查詢文章的匹配值。compare” 欄位用於一系列比較操作,我們將在後面的文章中詳述。

在 WP_Query 中使用這個欄位可以得到一個陣列,非常適合迴圈函式來顯示文章。在這篇文章中,我們將只介紹 meta_query 函式,而不是如何顯示 WP_Query 輸出。

通過多個元值查詢文章

如果要根據多個元鍵值檢查一個元鍵值,最好使用 “IN” 操作符。這可以通過在元查詢中使用陣列 “value” 來實現。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$meta_query_args = array(
'meta_query' => array(
array(
'key' => 'city_name',
'value' => array('New York City', 'London', 'San Francisco'),
'compare' => 'IN'
)
)
);
$meta_query = new WP_Query( $meta_query_args );
<?php $meta_query_args = array( 'meta_query' => array( array( 'key' => 'city_name', 'value' => array('New York City', 'London', 'San Francisco'), 'compare' => 'IN' ) ) ); $meta_query = new WP_Query( $meta_query_args );
<?php
$meta_query_args = array(
 'meta_query' => array(
 array(
 'key' => 'city_name',
 'value' => array('New York City', 'London', 'San Francisco'),
 'compare' => 'IN'
 )
 )
);
 
$meta_query = new WP_Query( $meta_query_args );

通過多個元關鍵字查詢文章

既然我們已經用單個元關鍵字查詢了文章,那麼現在就來用多個欄位/關鍵字查詢文章。這樣就可以根據多個自定義欄位來查詢文章。本示例通過將查詢巢狀到陣列中並在元查詢中新增 “relation”,將上述兩種方法結合起來。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$meta_query_args = array(
'meta_query' => array(
'relation' => 'AND',
array(
array(
'key' => 'city_name',
'value' => array('New York City', 'London', 'San Francisco'),
'compare' => 'IN'
),
array(
'key' => 'featured_post',
'value' => true,
'compare' => '='
)
)
)
);
$meta_query = new WP_Query( $meta_query_args );
<?php $meta_query_args = array( 'meta_query' => array( 'relation' => 'AND', array( array( 'key' => 'city_name', 'value' => array('New York City', 'London', 'San Francisco'), 'compare' => 'IN' ), array( 'key' => 'featured_post', 'value' => true, 'compare' => '=' ) ) ) ); $meta_query = new WP_Query( $meta_query_args );
<?php
$meta_query_args = array(
 'meta_query' => array(
 'relation' => 'AND',
 array(
 array(
 'key' => 'city_name',
 'value' => array('New York City', 'London', 'San Francisco'),
 'compare' => 'IN'
 ),
 array(
 'key' => 'featured_post',
 'value' => true,
 'compare' => '='
 )
 )
 )
);
 
$meta_query = new WP_Query( $meta_query_args );

“relation” 欄位可設定為 “AND” 或 “OR”,因此您可以要求滿足所有條件或僅滿足一個條件。

在日期之間查詢文章

在使用元查詢獲取 WordPress 文章時,另一種常用的查詢方式是查詢日期。下面介紹如何只查詢兩個日期之間的文章。

此功能假定日期的格式為 YYYY-MM-DD 結構。如果您使用的是高階自定義欄位,請確保您的返回日期格式設定為該格式。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$meta_query_args = array(
'meta_query' => array(
array(
'key' => 'my_date_field',
'value' => array( '2022-01-01', '2022-12-31' ),
'type' => 'date',
'compare' => 'BETWEEN'
)
)
);
$meta_query = new WP_Query( $meta_query_args );
<?php $meta_query_args = array( 'meta_query' => array( array( 'key' => 'my_date_field', 'value' => array( '2022-01-01', '2022-12-31' ), 'type' => 'date', 'compare' => 'BETWEEN' ) ) ); $meta_query = new WP_Query( $meta_query_args );
<?php
$meta_query_args = array(
 'meta_query' => array(
 array(
 'key' => 'my_date_field',
 'value' => array( '2022-01-01', '2022-12-31' ),
 'type' => 'date',
 'compare' => 'BETWEEN'
 )
 )
);
 
$meta_query = new WP_Query( $meta_query_args );

如果您使用的是 Unix 時間戳,那麼查詢日期之間的文章就更容易了。此程式碼片段將把日期轉換為 Unix 時間戳,並在兩者之間進行比較。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$meta_query_args = array(
'meta_query' => array(
array(
'key' => 'my_date_field',
'value' => array( strtotime('2022-01-01'), strtotime('2022-12-31') ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
$meta_query = new WP_Query( $meta_query_args );
<?php $meta_query_args = array( 'meta_query' => array( array( 'key' => 'my_date_field', 'value' => array( strtotime('2022-01-01'), strtotime('2022-12-31') ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) ) ); $meta_query = new WP_Query( $meta_query_args );
<?php
$meta_query_args = array(
 'meta_query' => array(
 array(
 'key' => 'my_date_field',
 'value' => array( strtotime('2022-01-01'), strtotime('2022-12-31') ),
 'type' => 'numeric',
 'compare' => 'BETWEEN'
 )
 )
);
 
$meta_query = new WP_Query( $meta_query_args );

當然,您也可以在上述查詢中使用大於或小於操作符來查詢某個日期之前/之後的文章。

元查詢比較運算子

有幾個運算子對通過元查詢來查詢文章很有幫助。下面是每個比較運算子的快速分解以及使用方法。

  • ‘=’:查詢與元值相等的元鍵
  • ‘!=’:查詢不等於元值的元鍵
  • ‘>’:查詢大於元值的元鍵
  • ‘>=’:查詢大於等於元值的元鍵
  • ‘<‘:查詢小於元值的元鍵
  • ‘<=’:查詢小於等於元值的元鍵
  • ‘LIKE’:查詢包含單詞/短語的元鍵(例如,查詢 “red “將匹配 “Red”、”looksred” 和 “redstyle” 等短語)
  • ‘NOT LIKE’:與上述相反
  • ‘IN’:查詢陣列中存在值的元鍵
  • ‘NOT IN’:查詢值不存在於陣列中的元鍵
  • ‘BETWEEN’:查詢值位於兩個數字之間的元鍵
  • ‘NOT BETWEEN’:查詢值不在兩個數字之間的元鍵
  • ‘EXISTS’:查詢元鍵中的值是否存在
  • ‘NOT EXISTS’:查詢值根本不存在的元鍵
  • ‘REGEXP’:根據正規表示式查詢元鍵
  • ‘NOT REGEXP’:與上述 REGEXP 相反

請記住,如果你沒有向 meta_query 輸入陣列,就需要在 WP_Query 引數中使用 meta_compare。

如何根據元欄位排序文章

當然,WordPress 允許您使用 WP_Query 中的 “orderby” 選項,使用自定義欄位對文章進行排序。使用 WP_Query 引數中的 orderby 引數就可以輕鬆實現這一功能。

您需要將 “orderby” 設定為 “meta_value”,然後將 “meta_key” 值設定為您的欄位名。預設情況下,如果希望查詢按字母順序返回,或欄位為數字時按數字排序,這個引數最有用。

當然,您也可以將 WP_Query 的 “post_type” 引數設定為 “post”、”page” 或自定義的文章型別值。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$meta_query_args = array(
'post_type' => 'page',
'order' => 'ASC',
'meta_key' => 'city_name',
'orderby' => 'meta_value'
);
$meta_query = new WP_Query( $meta_query_args );
<?php $meta_query_args = array( 'post_type' => 'page', 'order' => 'ASC', 'meta_key' => 'city_name', 'orderby' => 'meta_value' ); $meta_query = new WP_Query( $meta_query_args );
<?php
$meta_query_args = array(
 'post_type' => 'page',
 'order' => 'ASC',
 'meta_key' => 'city_name',
 'orderby' => 'meta_value'
);
 
$meta_query = new WP_Query( $meta_query_args );

如果您的元關鍵欄位是一個數字,您需要在 orderby 中使用 “meta_value_num” 值來向 WordPress 表明它是一個整數。
恭喜你,作為 WordPress 開發人員,你剛剛提升了自己的水平。

在 WordPress 中構建自定義功能時,學習元查詢是一個非常強大的工具。WordPress 會將元查詢中的引數轉化為 SQL 並查詢資料庫。如果您要建立任何自定義功能,建議使用 WordPress 內建函式,而不是硬編碼 MySQL 查詢。

如果您想加深對 WordPress 的瞭解,我建議您檢視 WP_Query 的文件。

評論留言