WordPress 內置的數組處理相關函數大全(WordPress純代碼實現直接將文章別名設置為文章ID)
文章目錄
- 1 WordPress 內置的數組處理相關函數大全
- 2 wp_parse_args
- 3 wp_parse_list
- 4 wp_parse_id_list
- 5 wp_parse_slug_list
- 6 wp_array_slice_assoc
- 7 wp_is_numeric_array
- 8 wp_list_filter
- 9 wp_list_pluck
- 10 wp_filter_object_list
- 11 wp_list_sort
- 12 map_deep
- 13 WordPress純代碼實現直接將文章別名設置為文章ID
- 14 一、修改固定鏈接結構
- 15 二、批量修改舊文章(現在資料庫裡面的文章)的別名為文章 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
二、批量修改舊文章(現在資料庫裡面的文章)的別名為文章 ID 的四種方法
方法一:在模板函數 functions.php 文件中添加代碼實現批量修改舊文章別名
使用方法:將下邊的代碼添加到到當前主題目錄下 functions.php 文件,在php結束標記 ?> 前 即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 修改WordPress舊文章別名為文章ID function Bing_post_name_id(){ query_posts( \'posts_per_page=-1\' ); while( have_posts() ){ the_post(); $post_id = $GLOBALS[\'post\']->ID; wp_update_post( array( \'ID\' => $post_id, \'post_name\' => $post_id ) ); } wp_reset_query(); } if( $_GET[\'post_name_id\'] == \'yes\' ) add_action( \'init\', \'Bing_post_name_id\' ); |
放置好代碼後,訪問一下下邊的網站,注意替換成你的域名,訪問前注意一定要備份數據,以免出錯。
http://www.aszhi.com?post_name_id=yes
文章多的話網頁載入會比較慢,因為正在一篇文章一篇文章的修改別名,要耐心等到網頁完全載入好才可以。
PS:載入好後,刪除之前添加的代碼,修改完成,所有文章的別名都會變成自身的ID。
方法二:在配置文件 wp-config.php 中添加代碼實現批量修改舊文章別名
使用方法:將下面的代碼添加到網站 根目錄的 wp-config.php 的最底部,保存後,訪問一次網站首頁(你將看到瀏覽器一直都在努力打開網頁,不要急,耐心等待,直到網頁真正打開,所需時間看文章數和網路情況而定)。等網頁打開後,刪除剛剛添加到 wp-config.php 的代碼!(刪除代碼是為了防止下次打開網站首頁緩慢的情況發生)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/** 批量更改舊文章的別名為文章ID */ // 添加一個變數來包容文章標題數組,防止重複操作 $slug_done = array(); // 查詢所有文章 $posts = $wpdb->get_results( \" SELECT `ID`, `post_title` FROM `\" . $wpdb->posts . \"` WHERE `post_type` = \'post\' \" ); // 輸出文章 foreach( $posts AS $single ) { $this_slug = $single->ID; $slug_done[] = $this_slug; // 使用文章ID替換文章原來的別名 $wpdb->query( \" UPDATE `\" . $wpdb->posts . \"` SET `post_name` = \'\" . $this_slug . \"\' WHERE `ID` = \'\" . $single->ID . \"\' LIMIT 1 \" ); } |
方法三:直接替換SQL資料庫里的 post_name 欄位的方法
進入 mysql 命令【 選擇你所創建的資料庫的命令:mysql> USE MYSQLDATA; (註:MYSQLDATA是資料庫的名稱。按回車鍵出現 Database changed 時說明操作成功!) 】或者 phpmyadmin 的 SQL (登錄後打開資料庫管理系統,找到網站對應的wordpress資料庫,點擊後,在上方有個SQL按鈕) ,執行如下SQL命令修改即可:
1 |
update wp_posts set post_name=ID where post_status=\'publish\' and post_type=\'post\'; |
PS:wp_posts 是 WordPress 的文章數據表,wp_ 是默認的前綴,如果自定義更改過,請根據實際修改即可。
1. 帶 [親測] 說明源碼已經被站長親測過!
2. 下載後的源碼請在24小時內刪除,僅供學慣用途!
3. 分享目的僅供大家學習和交流,請不要用於商業用途!
4. 本站資源售價只是贊助,收取費用僅維持本站的日常運營所需!
5. 本站所有資源來源於站長上傳和網路,如有侵權請郵件聯繫站長!
6. 沒帶 [親測] 代表站長時間緊促,站長會保持每天更新 [親測] 源碼 !
7. 盜版ripro用戶購買ripro美化無擔保,若設置不成功/不生效我們不支持退款!
8. 本站提供的源碼、模板、插件等等其他資源,都不包含技術服務請大家諒解!
9. 如果你也有好源碼或者教程,可以到審核區發布,分享有金幣獎勵和額外收入!
10.如果您購買了某個產品,而我們還沒來得及更新,請聯繫站長或留言催更,謝謝理解 !
GG資源網 » WordPress 內置的數組處理相關函數大全(WordPress純代碼實現直接將文章別名設置為文章ID)