GG資源網

WordPress 內置的數組處理相關函數大全(WordPress純代碼實現直接將文章別名設置為文章ID)

WordPress 內置的數組處理相關函數大全

我們使用 WordPress 開發的時候,有很大一部分的工作和數組處理有關,WordPress 本身也內置了一些非常方便的數組處理函數,今天給大家羅列一下,也方便自己以後寫代碼的時候查詢。

wp_parse_args

wp_parse_args($args, $defaults=[])

將用戶定義的參數($args)合併到默認的參數($defaults)中,用戶自定義的參數可以是數組,也可以是對象,甚至支持鏈接地址查詢類型的字元串(比如:"id=5&status=draft")。

$args = wp_parse_args($args, [
'post_type' => 'post',
'posts_per_page' => 5,
'cat' => 1
]);

也可以使用該函數將鏈接地址查詢類型的字元串轉換成數組:

$args = wp_parse_args('post_type=post&posts_per_page=5&cat=1');

// 輸出 Array ( [type] => post [posts_per_page] => 5 [cat] => 1 )

wp_parse_list

wp_parse_list( $list )

將逗號或者空格隔開的標量轉換成數組。

wp_parse_list('1 2,3 abc');

// 輸出 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => abc )

wp_parse_id_list

wp_parse_id_list($list)

將多個 ID 組成數組,或者逗號或者空格隔開的 ID 列表,轉換過一個純數字沒有重複的 ID 數組。

wp_parse_id_list(array( 1, 13, '11', 13 ))

或者

wp_parse_id_list('1, 13 11, 13')

這兩個都輸出:

// Array ( [0] => 1 [1] => 13 [2] => 11 )

wp_parse_slug_list

wp_parse_slug_list($list)

將多個字元串組成的數組,或者逗號或者空格分隔的字元串列表,轉換過一個別名(slug)(對數組每個元素調用 sanitize_title 處理)的數組。

用法和 wp_parse_id_list 類似,這裡就不再重複。

wp_array_slice_assoc

wp_array_slice_assoc( $array, $keys )

根據給定的鍵值列表從關聯數組中獲取相關的子數組。這個非常好理解:

$array = array(
1 => 'Item 1',
2 => 'Item 2',
3 => 'Item 3',
4 => 'Item 4',
5 => 'Item 5',
);

wp_array_slice_assoc($array, array(1,3,5));

將會返回:

Array
(
[1] => Item 1
[3] => Item 3
[5] => Item 5
)

wp_is_numeric_array

wp_is_numeric_array( $data )

判斷數組是否數字索引的數組,非常簡單,就不再舉例了。

wp_list_filter

wp_list_filter($list, $args = array(), $operator = 'AND')

根據一組 key=>value 的參數,來過濾一組對象(或者數組)列表,比如下面就是 WordPress 查詢到了多種 post_type 的日誌列表結果,過濾出 page 類型的:

$pages = wp_list_filter( $wp_query->posts, array('post_type' => 'page'));

還有第三個元素 $openrator,它的默認值是 AND,還有 OR 和 NOT 這兩個參數,意思是 $args 參數中的 key=>value 有多個的時候的比較方式,AND 就是所有都要相等,OR 只要一組值相等即可,NOT 所有的值都不相等才行。

當然我們也可以使用 PHP 的原生函數 array_filter 實現相同的功能。

wp_list_pluck

wp_list_pluck( $list, $field, $index_key = null )

從對象(或者數組)列表中每個元素中去某個欄位組成一個新數組,最後一個參數是新數組的元素 key,使用原來列表元素的 $index_key 值,比如下面的數組:

$foods = array(
array(
'id' => 4,
'name' => 'Banana',
'color' => 'Yellow',
),
array(
'id' => '5',
'name' => 'Apple',
'color' => 'Red',
),
array(
'id' => 2,
'name' => 'Lettuce',
'color' => 'Green',
),
array(
'id' => '7',
'name' => 'Apple',
'color' => 'Red',
)
);

我們取出 'name' 列的值組成新數組:

$food_names = wp_list_pluck( $foods, 'name' );

將返回:

Array
(
[0] => Banana
[1] => Apple
[2] => Lettuce
[3] => Apple
)

如果我們想使用原來列表的每個元素的 id 作為 key

$food_names = wp_list_pluck( $foods, 'name', 'id' );

將得到:

Array
(
[4] => Banana
[5] => Apple
[2] => Lettuce
[7] => Apple
)

從 PHP 5.5 開始,PHP 的 array_column 函數也可實現同樣的功能了。

wp_filter_object_list

wp_filter_object_list( $list, $args = array(), $operator = 'and', $field = false )

這個函數就是先 wp_filter_list 操作,然後如果 $field 參數值不為空,則再進行 wp_list_pluck 操作,不過它沒有 wp_list_pluck 的 $index_key 參數。

wp_list_sort

wp_list_sort($list, $orderby = array(), $order = 'ASC', $preserve_keys = false)

根據 orderby 的參數對對象(或者數組)列表進行排序,最後一個參數 $preserve_keys 用於是否保持原來的 key。

比如我們可以把文章列表按照發布時間降序排序:

$sorted_posts = wp_list_sort( $posts, 'post_date', 'DESC' );

根據時間降序,然後根據標題升序排序:

$sorted_posts = wp_list_sort($posts, array(
'post_date' => 'DESC',
'post_title' => 'ASC',
));

map_deep

map_deep( $value, $callback )

將函數映射到數組或對象的所有不可迭代元素,有點類似於 array_walk_recursive() 函數,但是 map_deep 還支持對象:

比如,對數組或者對象的所有元素進行 URL 編碼:

map_deep( $value, 'urlencode' )

所以 WordPress 基於 map_deep 創建幾個深度映射回調的函數:

  • stripslashes_deep:對於是字元串元素執行去掉斜線操作。
  • urlencode_deep:對元素執行 URL 編碼操作。
  • rawurlencode_deep:對元素執行 RAWURL 編碼操作。
  • urldecode_deep:對元素執行 URL 解碼操作。

當然我們也可以基於函數創建執行深度映射操作的函數。

關於 WordPress 內置的函數,我目前收集到就是那麼多,如果你有發現什麼好的函數也可以留言告訴我。

WordPress純代碼實現直接將文章別名設置為文章ID

使用WordPress博客的站長朋友肯定對文章別名不陌生,很多人的固定連接都是圍繞著文章的 ID(/%post_id%.html) 展開的,而在國外很多站點的固定鏈接都是採用文章別名的。且有些插件和主題是必須要設置%postname%.html 這樣的別名固定鏈接才能使用,而中文站點自動生成的文章別名直接是漢字(默認為文章的標題生成為文章別名),就會出現中文鏈接,那麼調用出來的將會是一堆亂碼(因為WordPress對中文的別名進行了編碼,在資料庫中存儲的不是中文),文章鏈接地址也會很長,不利於SEO優化,非常不好。

為了SEO優化,在不改變以前的用文章ID作為文章鏈接地址且已經被收錄的文章則要保證全部還能訪問,不會造成了大量的死鏈接。這樣就需要我們手動修改別名(WordPress使用自動生成的文章ID作為文章別名),今天就介紹如何用純代碼實現直接將 WordPress 所有文章別名設置為文章ID的方法。

PS:為了安全起見,所有設置資料庫的操作務必記得先備份網站的資料庫,避免因失誤帶來無法挽回的損失!然後再按照下文操作!

一、修改固定鏈接結構

在後台的 「設置」 → 「固定連接」 → 「自定義結構」選項 里設置一下固定連接,把 ID 改成別名,也就是把固定連接里的 /%post_id%.html 改成/%postname%.html

WordPress設置固定鏈接

二、批量修改舊文章(現在資料庫裡面的文章)的別名為文章 ID 的四種方法

方法一:在模板函數 functions.php 文件中添加代碼實現批量修改舊文章別名

使用方法:將下邊的代碼添加到到當前主題目錄下 functions.php 文件,在php結束標記 ?> 前 即可。

放置好代碼後,訪問一下下邊的網站,注意替換成你的域名,訪問前注意一定要備份數據,以免出錯。

http://www.aszhi.com?post_name_id=yes

文章多的話網頁載入會比較慢,因為正在一篇文章一篇文章的修改別名,要耐心等到網頁完全載入好才可以。

PS:載入好後,刪除之前添加的代碼,修改完成,所有文章的別名都會變成自身的ID。

方法二:在配置文件 wp-config.php 中添加代碼實現批量修改舊文章別名

使用方法:將下面的代碼添加到網站 根目錄的 wp-config.php 的最底部,保存後,訪問一次網站首頁(你將看到瀏覽器一直都在努力打開網頁,不要急,耐心等待,直到網頁真正打開,所需時間看文章數和網路情況而定)。等網頁打開後,刪除剛剛添加到 wp-config.php 的代碼!(刪除代碼是為了防止下次打開網站首頁緩慢的情況發生)

方法三:直接替換SQL資料庫里的 post_name 欄位的方法

進入 mysql 命令【 選擇你所創建的資料庫的命令:mysql> USE MYSQLDATA; (註:MYSQLDATA是資料庫的名稱。按回車鍵出現 Database changed 時說明操作成功!) 】或者 phpmyadmin 的 SQL (登錄後打開資料庫管理系統,找到網站對應的wordpress資料庫,點擊後,在上方有個SQL按鈕) ,執行如下SQL命令修改即可:

PS:wp_posts 是 WordPress 的文章數據表,wp_ 是默認的前綴,如果自定義更改過,請根據實際修改即可。

由於網站搬家,部分鏈接失效,如無法下載,請聯繫站長!謝謝支持!
1. 帶 [親測] 說明源碼已經被站長親測過!
2. 下載後的源碼請在24小時內刪除,僅供學慣用途!
3. 分享目的僅供大家學習和交流,請不要用於商業用途!
4. 本站資源售價只是贊助,收取費用僅維持本站的日常運營所需!
5. 本站所有資源來源於站長上傳和網路,如有侵權請郵件聯繫站長!
6. 沒帶 [親測] 代表站長時間緊促,站長會保持每天更新 [親測] 源碼 !
7. 盜版ripro用戶購買ripro美化無擔保,若設置不成功/不生效我們不支持退款!
8. 本站提供的源碼、模板、插件等等其他資源,都不包含技術服務請大家諒解!
9. 如果你也有好源碼或者教程,可以到審核區發布,分享有金幣獎勵和額外收入!
10.如果您購買了某個產品,而我們還沒來得及更新,請聯繫站長或留言催更,謝謝理解 !
GG資源網 » WordPress 內置的數組處理相關函數大全(WordPress純代碼實現直接將文章別名設置為文章ID)

發表回復

CAPTCHAis initialing...