2012-10-24 50 views
9

2012年10月25日 - 仍未解決!請看下面:標記數組排序問題

我的客戶有一個WordPress標籤雲(標記陣列)用標籤,其中包括[「]字符,以及[的]前綴一些標籤,即:

"rose" 
"autumn" 
The Abby 
The Cloud 
The Elephant 

顯然,所有的包含在引號[「]中的標籤在列表頂部排序,所有以[前綴]開頭的單詞在字母[T]的周圍進行排序(遵循邏輯ASC順序)。

它灑在我身上:「所有標籤(在WP標籤雲中)必須按照升序排列,但包含[」「]或[]字符的標籤必須與其他所有標籤一起排序時間順序,忽略[「]和[]的前綴。

我看着WP核心功能:

**function wp_generate_tag_cloud** 

,但我不知道從哪裏開始。在原始SQL語句中,我可以使用trim()過濾掉標籤雲數組中的[「」]和[The]字符,但這只是我不知道如何應用的一種想法。

+1

您想在MySQL或PHP中對它們進行排序嗎? –

+1

我想任何一種方式都可以,只要我可以將它連接到WP [wp_generate_tag_cloud]核心函數。問題不在於如何讓MySQL查詢忽略選定的字符,然後對它們進行排序(ORDER BY)ASC,問題是如何將任何良好的解決方案集成到WP平臺中。謝謝。 – Milan

+1

Could not you just update the database table and remove both the quotes and article?然後在標籤表單中添加一些類似過濾器的東西來刪除這些新創建的標籤? –

回答

4

wp_generate_tag_cloud()調用一個名爲tag_cloud_sort的過濾器,該過濾器可以覆蓋$args參數中指定的排序順序。 tag_cloud_sort過濾器接收到一組標籤,並將實際的$args參數傳遞給wp_generate_tag_cloud(),因此它可以檢查wp_generate_tag_cloud()調用的完整設置並相應地調整其行爲。

你可以嘗試這樣的事:

function custom_tag_sort($tags, $args) { 
    if ($args['orderby'] != 'name') { 
     // do not reorder if sort order is not by name. 
     // wp_generate_tag_cloud() is smart enough to notice order 
     // is not changed and will proceed with its regular sort logic. 
     return $tags; 
    } 
    uasort($tags, 'custom_tag_sort_compare'); 
} 

function custom_tag_sort_compare($a, $b) { 
    return strnatcasecmp(
     custom_tag_sort_normalize($a->name), 
     custom_tag_sort_normalize($b->name) 
    ); 
} 

function custom_tag_sort_normalize($tag) { 
    // strip quote marks 
    $tag = trim($tag, '"'); 
    // strip leading definitive article 
    $tag = preg_replace('/^\s*the\s+/i', '', $tag); 
    return $tag; 
} 

add_filter('tag_cloud_sort', 'custom_tag_sort'); 

免責聲明:我只在wp_generate_tag_cloud()功能的粗略檢查後寫了這個。我沒有在一個實時的WordPress安裝中測試它;我只驗證了排序功能在您的示例標籤雲上正常工作:

The Abby 
"autumn" 
The Cloud 
The Elephant 
"rose" 
+1

你好,這看起來很有前途。我已經將它包含到了functions.php文件中。它似乎還沒有工作,但讓我玩弄它,如果這會讓我走上正確的道路,我會投你一票。謝謝! – Milan

+0

.. OK,即使我仍然沒有在我的腳本中做這項工作,我仍然會對此進行投票,因爲我沒有按'name'排序,而是返回一個數組,而不是:wp_tag_cloud('format = array') – Milan

+1

默認值爲'wp_tag_cloud'和'wp_generate_tag_cloud'的'orderby'參數是'name',所以如果你調用'wp_tag_cloud('format = array')',你仍然可以在'wp_generate_tag_cloud'中按名稱排序。如果'wp_generate_tag_cloud'被不同的排序順序調用_explicitly_,我的實現只會避免不正確的排序。 – lanzz

2

好吧,所以你想避免修改wordpress的核心代碼...當你的客戶點擊更新按鈕後,你告訴他不要,那麼你將不得不進入,並再次混亂..使用行動代替鉤子。有一個用於掛鉤標籤雲功能的輸出。添加到您的主題功能文件

function tagCloudFilter($tagCloudString, $args) 
{ 
    $tagCloudString = str_replace('The','', $tagCloudString); 
    $tagCloudString = str_replace('"','', $tagCloudString); 
} 

add_filter('wp_tag_cloud', 'tagCloudFilter', 10, 2); 

這將至少擺脫你不想要的東西。至於排序它不知道,但這應該讓你在你的方式。它可能更容易排序它與jquery

如果你真的想修改核心代碼,在其格式化之前在標籤數組中運行一個foreach循環,並在該循環中使用上面的str_replaces。正好運行sort()在那個陣列上,你應該很好。但是,如果是我,我會去的半解,而不是把它按字母順序排列,而不是修改WordPress的核心

+0

第1部分:你好;謝謝。您的意見是有道理的,我同意我最不想做的事情是修改核心,迫使自己記住每次WP需要更新時的變化。話雖如此,str_replace動作鉤子是一個很好的解決方案。但是,我很難弄清楚如何正確掛接「函數wp_generate_tag_cloud」,所以SQL查詢也會被修改。例如,我可以以某種方式在當前MySQL查詢中添加子句.... ORDER BY TRIM(LEADING'The'FROM(slug))。 (我沒有測試它,我只是... – Milan

+0

第2部分:...從頭頂上烹飪)但是如何?另外,當我使用str_replace時,它會逐字地過濾掉(替換)我仍然需要保留的數組值的字符。還有什麼想法?再次感謝你。 – Milan

0

這裏有一個想法:

你可以複製原始tag_cloud功能,並在你的函數創建你自己的。 PHP。

所做的更改你想添加的功能,這裏面過濾器:

$return = apply_filters('YOUR_tag_cloud_function', $return, $args); 

,然後創建以前的篩選器將函數添加到鉤:

add_filter('wp_tag_cloud', 'YOUR_tag_cloud_function'); 

我不不知道它是否有效,我沒有測試它。你怎麼看?