0

我需要将标题转换为标签。我想控制长度。不希望标签太短或太长,如果标签不存在,我还需要在标签前面添加一个井号标签(#),但清除任何其他字符。

下面的代码有效,但它仅将哈希标签应用于前两个标签。

$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

我不知道您所说的“它仅将哈希标签应用于前两个标签”是什么意思。您的功能是否无法运行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 回答