我需要将标题转换为标签。我想控制长度。不希望标记太短或太长,我还需要在标记前面添加一个哈希标记(#)(如果不存在),但清除任何其他字符。
下面的代码有效,但它只将哈希标记应用于前两个标记。
$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操作
上运行这样做的最佳方式是什么?
答案 0 :(得分: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
- 因为它已经被清除了。你只需要打破破折号而不是空格。