2011-12-08 6 views
3

UPDATE、コードは現在動作しています。ワードプレス - ポストセーブ時にタグとしての単語スラッグの自動挿入

私は以下のコードを持っていますが、それは予想外にうまく動作しません。 TAXONOMY_NAMEタクソノミからの条件はカスタムの投稿タイプCUSTOM_POST_TYPEに対してのみ使用し、タグとして追加する必要があります。


add_action('save_post','add_tags_auto'); 
function add_tags_auto($id) { 

    $terms = get_the_terms($post->id, 'TAXONOMY_NAME'); // get an array of all the terms as objects. 
    $add_tags = array(); 

    foreach($terms as $term) { 
     $add_tags[] = $term->slug; // save the slugs in an array 
    } 
    $temp = array(); 
    $tags = get_the_tags($id); 
    if ($tags) { 
    foreach ($tags as $tag) 
     $temp[] = $tag->name; 
    } 
    $tags = $temp; 

    $post = get_post($id); 

    if ($post->post_type != 'CUSTOM_POST_TYPE') 
     return false; 

    foreach ($add_tags as $t) 
     if (!in_array($t,$tags)) 
      wp_add_post_tags($id,$add_tags); 
} 

答えて

0

これは未テストですが、それは正しい方向への一歩である必要があり、私はいくつかの微調整を行ったとコメントします:私はあなたのコードを見

<?php 
add_action('save_post','add_tags_auto'); 
function add_tags_auto($post_id) { 
    $post = get_post($post_id); 

    // bail if this isn't a type of post we want to auto-tag 
    if($post->post_type != 'CUSTOM_POST_TYPE') 
     return false; 

    // -------------------------------------------------- 
    // get the list of tag names from the post 
    // -------------------------------------------------- 
    $tagNames = array(); 
    $tags  = get_the_tags($post_id); 

    foreach($tags as $tag) 
     $tagNames[] = $tag->name; 

    // -------------------------------------------------- 
    // get the list slugs from terms in the post, any 
    // slugs that aren't alredy a tag, will be marked for 
    // addition automatically 
    // -------------------------------------------------- 
    $tagsToAdd = array(); 
    foreach(get_the_terms($post_id, 'TAXONOMY_NAME') as $term) 
     if(!in_array($term->slug, $tagNames)) 
      $tagsToAdd[] = $term->slug; 

    // if we have some new tags to add, let's do that now 
    if(!empty($tagsToAdd)) 
     wp_add_post_tags($post_id, implode(',', $tagsToAdd)); 
} 

一つの潜在的な問題の使用後に$ postに設定されました。私はかなり確信しています$ post-> idが関数の最初の行で呼び出されたとき$投稿が非オブジェクトであるという警告が出されています。だから、私はget_postまでの呼び出しを関数の先頭に移動しました。

私が追加したちょっとした微調整は、投稿が希望のタイプでない場合に早期に返すことです。よりすぐ下のチェックで捨てられるかもしれない計算を行う時間を費やすのではなく、これをできるだけ早く実行することをお勧めします。

私はまた、foreachループの数を集約し、説明のためにいくつかの変数の名前を変更しました。期待どおりに動作していないオリジナルのコードで見た唯一の他のものは、wp_add_post_tagsit's documentedへの呼び出しで、配列ではなく2番目のパラメータとしてコンマ区切りの文字列を取ることです。

+0

タグの数を制限しても結構です –

+0

はい、あなたは '$ tagsToAdd [] = $ term-> slug;'を呼び出すforeachを終了できます。あなたが変数を持っていて、$ iMaxTagsと呼びます(例えば、データベースからそれを設定することができます)。ループの条件は 'if($ i <$ iMaxTags &&!in_array($ term-> slug、$ tagNames)) '; foreachを 'as $ i => $ term'に変更してください。 – quickshiftin

+0

ただし、これはかなり限定的な方法です。実用的な解決法は、おそらく、それらをよりインテリジェントにフィルタリングしようとします。 – quickshiftin

関連する問題