2012-10-24 15 views
9

2012年10月25日 - はまだ解決していません!以下を参照してください:タグ配列のソート問題

私のクライアントは、[ "]文字だけでなく、いくつかのタグの[ザ・]接頭辞が含まれるタグとWordPressのタグクラウド(タグ配列)を持つ例:。もちろん

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

すべて引用符[ "]で囲まれたタグがリストの一番上にソートされ、[ザ・]接頭辞で始まるすべての単語は(論理的ASC順次)[T]どこかの文字の周りに並べ替えられています。

「私はWPタグクラウド内のすべてのタグを昇順に並べ替える必要がありますが、[""]または[The]を含むタグは、すべてのタグでソートする必要があります。 []]と[The]プレフィックスは無視されます。

私はWPのコア機能に見えた:

**function wp_generate_tag_cloud** 

が、私はどこから始めれば見当がつかない。生のSQL文では、私はおそらく[」「]をフィルタリングするために)(トリムを使用することができますし、[ザ・]の文字は、タグクラウドのアレイを形成するが、それは私がどのように適用するか分からないだけと考えられています。

+1

MySQLまたはPHPでソートしますか? –

+1

WP [wp_generate_tag_cloud]コア機能に接続できる限り、どちらの方法でも問題ありません。問題は、MySQLクエリが選択された文字を無視して結果的にASC(ORDER BY)ASCをソートする方法ではなく、WPプラットフォームにどのような "良い"ソリューションを統合するかという問題です。ありがとうございました。 – Milan

+1

データベーステーブルを更新して引用符と記事の両方を削除できませんでしたか?次に、タグフォームにフィルタのようなものを追加して、新しく作成されたタグについてこれらのものを削除しますか? –

答えて

4

wp_generate_tag_cloud()は、$argsパラメータで指定されたソート順を上書きできるtag_cloud_sortというフィルタを呼び出します。 tag_cloud_sortフィルタはタグの配列とwp_generate_tag_cloud()に渡される実際の$argsパラメータを受信するので、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

[OK]をクリックして、クライアントは、更新ボタンを押したとき、あなたは、あなたのは再びそれで行くと混乱しているつもり、ないように言った後、あなたが...ワードプレスのコアコードを変更しないようにしたいので...アクションを使用します代わりにフック。タグクラウド機能の出力にフックするためのものが便利です。これをテーマ関数ファイルに追加してください

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を使用してください。その配列にあなたは良いことがあります。それは私だったら、私は半分の溶液で行くと、それはアルファベット順wordpressのコアここで

+0

パート1:こんにちは。ありがとうございました。あなたのコメントは理にかなっています。最後にしたいのは、WPを更新する必要があるたびに変更内容を覚えて強制的にコアを修正することです。つまり、str_replaceアクションフックは素晴らしい解決策です。しかし、 "関数wp_generate_tag_cloud"に正しくフックしてSQLクエリが変更されるようにするのは難しいです。たとえば、私は何らかの理由で現在のMySQLクエリに「... ORDER BY TRIM」という節を追加することができます(「 'FROM(slug)」)。 (私はそれを試していない、私はちょうど... – Milan

+0

パート2:...私の頭の上からそれを調理する)しかし、どのように?また、私はstr_replaceを使用すると、それでもまだ保持する必要がある配列値から文字をフィルタリング(置換)します。それ以上の考え?ありがとうございました。 – Milan

0

を変更するよりも、持っていないだろうと思ったのです。

元のtag_cloud機能をコピーして、あなたの機能に独自に作成することができます。 php。

add_filter('wp_tag_cloud', 'YOUR_tag_cloud_function'); 

Iドン:フックにあなたの機能を追加するために

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

そして、前のフィルタを作成します。

あなたが作成し、関数内でこのフィルタを追加する変更を行いますそれが動作するかどうかわからない、私はそれをテストしませんでした。どう思いますか?