0

タイトルをタグに変換する必要があります。長さをコントロールしたい。タグが短すぎたり長すぎたりしたくないので、タグが存在しない場合はタグの前にハッシュ タグ (#) を追加する必要がありますが、他の文字は消去します。

以下のコードは機能しますが、最初の 2 つのタグにのみハッシュ タグを適用します。

$title = get_the_title($post_id);

$splittotags = explode(" ", $title);

foreach ($splittotags as $atag){

     if( strlen($atag) > 4 && strlen($atag) < 15 ){
         $first = $atag[0];

         if($first == '#'){
             $atagg = ereg_replace("[^A-Za-z0-9#]", "", $atag );
         }else{
             $atagg = ereg_replace("[^A-Za-z0-9#]", "", "#".$atag );
         }

         if($atag !=NULL){
       wp_set_object_terms($post_id, $atagg, 'post_tag', true );
         }
  }

}

私はまた、次のような悪いタグで配列を定義することも考えています:

 $not_tag = array("!", "by", "me", "auto", "mine", "by");

そして、これを行うだけです:

 if( !in_array($atag, $not_tag){

コードは save_post アクションで実行されます

これを行う最善の方法は何ですか?

4

1 に答える 1

0

「ハッシュタグを最初の2つのタグにのみ適用する」という意味がわかりません。関数の実行に失敗していますwp_set_object_termsか、それとも関数が実行されているのにタグが正しく割り当てられていませんか?

関数が失敗する理由がわかりません。おそらく、この行if($atag !=NULL){ は期待どおりに機能していません。思うNULLように動かないこともあるでしょう。'' !== NULLたとえば、空の文字列は NULL ( ) ではありません。

これはテストされていませんが、あなたが持っているよりもクリーンな機能だと思います。うまくいくと確信しています。

$title = get_the_title($post_id);
$splittotags = explode(" ", $title);
$tags = array();
foreach ($splittotags as $atag){
  $atagg = preg_replace("/[^A-Za-z0-9]/", "", $atag ); // this will clear any existing hash characters
  if(!empty($atagg) && strlen($atagg) > 4 && strlen($atagg) < 15){
    $tags[] = '#'.$atagg;
  }
  $atagg = ''; // Clear $atagg. I'm paranoid.
}
wp_set_object_terms($post_id, $tags, 'post_tag', true );

投稿名の使用を検討することもできますglobal $post; echo $post->post_name-- -- 既にクリーンアップされているためです。スペースではなくダッシュで区切るだけです。

于 2012-10-14T18:53:20.733 に答える