掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
WordPress雖然是一款博客程序,但實際上有很多企業(yè)網(wǎng)站依然使用它,其中包括很多著名的大型公司官網(wǎng)都是基于WordPress創(chuàng)建的。而事實上,除了博客和企業(yè)官網(wǎng),它還可以通過二次開發(fā),開發(fā)成購物商城、資訊門戶等邏輯更為復(fù)雜的web應(yīng)用。當(dāng)然有人會說在不經(jīng)過深度優(yōu)化前提下,WordPress的性能是一個問題,但我想說的是,對于絕大多數(shù)企業(yè)官網(wǎng)也好,還是其他應(yīng)用也好,它的性能問題不是問題,因為你的運營如果能遇到真正的性能問題,說明你的運營已經(jīng)非常成功了(當(dāng)然指的是中小網(wǎng)站)。
因為二次開發(fā),因此我們時長會碰到各種各樣的需求,比如說一個個人博客,他需要對他的博客文章按照瀏覽數(shù)進(jìn)行排序;再或者,一個基于WordPress開發(fā)的購物網(wǎng)站,需要對商品按照評分來排序(商品采用posts表改造,只是post_type的值另外指定的,這個功能需要另外開發(fā),這里先不說)。
簡單地來說,這樣的需求都可以總結(jié)為:按照文章自定義字段進(jìn)行排序。
誠然,這是再簡單不過的東西了,無非就是select的了,一句sql就能搞定,而且WordPress有內(nèi)置的數(shù)據(jù)庫操作方法(如$wpdb對象)。但如果熟悉這個程序的都知道,實際上它的數(shù)據(jù)結(jié)構(gòu)的范式是比較低的,三大主要內(nèi)容post、comment以及users實際上一共有6張表,各自分別有一個主表和一個存儲meta信息的數(shù)據(jù)表。
實際上這個問題,在一般情況下(是指沒有特殊應(yīng)用需求場景下),根本不需要自己自己重新用$wpdb對象來對數(shù)據(jù)庫進(jìn)行操作。而使用非常強大也非常常用的query_posts()方法即可,這個方法的說明在國內(nèi)網(wǎng)站上比比皆是,但我覺得大部分都沒講透徹,比如現(xiàn)在說的這個需求很多文章就沒講。
在國內(nèi)很多文章中,也寫到了query_posts()參數(shù)中有orderby和order,但其中orderby主要還是介紹按照指定的某幾個字段(主要是posts主表中的字段)進(jìn)行排序的。而關(guān)于自定義字段的排序很多都沒有講到,實際上是可以按照自定義字段排序的。
下面來舉一個例子,按照文章閱讀數(shù)調(diào)取閱讀最多的10篇文章,當(dāng)然閱讀數(shù)WordPress默認(rèn)情況下也是沒有的,需要另外開發(fā)相應(yīng)功能,開發(fā)過程網(wǎng)上一大把,自己寫也很簡單。實際上query_posts()的orderby的值是支持自定義字段的,如果給上meta_value_num即可,當(dāng)然同時要定義meta_key這個參數(shù),比如在開發(fā)閱讀數(shù)的時候meta_key的值是views,那么以上需求的核心代碼就是如下了:
$args=array( 'meta_key' => 'views', 'orderby' => 'meta_value_num', 'posts_per_page'=>10, 'order' => 'DESC' ); query_posts($args); while (have_posts()) : the_post(); //輸出代碼段,如帶上HTML代碼 endwhile;wp_reset_query();
當(dāng)然最好的理解就是直接看官方文檔,文檔地址為:
https://developer.wordpress.org/reference/functions/query_posts/。
最后還有更好準(zhǔn)確的就是去閱讀源代碼吧,源碼位于wp-includes/query.php中。
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流