强制在保存时从标题自动生成POST Slug

时间:2012-05-22 作者:Scott

我在经营一个房产网站,很多房产都是在公寓楼里出售的。

因此,内容编辑器所做的就是创建一个包含所有详细信息的帖子/属性,然后使用一个重复的帖子插件来创建其他帖子。

每次他们复制一个帖子/属性时,他们都会更改标题以反映属性编号,可能还会更改一些元数据,例如价格。

他们忘了做的是删除slug,然后从标题中生成一个新的slug。以下是输入的第一个属性的slug示例:

merle-court-plot-50-182-carlton-vale-nw6-5hh

但当它们复制时,鼻涕虫变成:

merle-court-plot-50-182-carlton-vale-nw6-5hh-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2-2-2
etc
但当他们更改标题时,鼻涕虫会更喜欢:

merle-court-plot-51-182-carlton-vale-nw6-5hh
merle-court-plot-52-182-carlton-vale-nw6-5hh
merle-court-plot-53-182-carlton-vale-nw6-5hh
merle-court-plot-54-182-carlton-vale-nw6-5hh
etc
所以我的问题是:

在更新属性标题后,如何强制在保存后重新生成slug?

此CPT的段塞应始终自动生成,无需手动设置。

4 个回复
最合适的回答,由SO网友:Eugene Manuilov 整理而成

最简单的解决方法可能是:

function myplugin_update_slug( $data, $postarr ) {
    if ( ! in_array( $data[\'post_status\'], array( \'draft\', \'pending\', \'auto-draft\' ) ) ) {
        $data[\'post_name\'] = sanitize_title( $data[\'post_title\'] );
    }

    return $data;
}
add_filter( \'wp_insert_post_data\', \'myplugin_update_slug\', 99, 2 );

SO网友:Pete Nelson

另外,从sanitize_title_with_dashes() 通过wp_unique_post_slug() 确保其唯一性。如果需要,它将自动附加“-2”、“3”等。

SO网友:jintux

您应该使用内置函数,而不是替换空格sanitize_title() 这将为您解决更换问题。

像这样:

sanitize_title( $post_title, $post->ID );
此外,您应该使用一个独特的slug。您可以通过函数wp_unique_post_slug()

因此,将所有这些放在一起,一个解决方案可能是:

function myplugin_update_slug( $data, $postarr ) {
    if ( ! in_array( $data[\'post_status\'], array( \'draft\', \'pending\', \'auto-draft\' ) ) ) {
        $data[\'post_name\'] = wp_unique_post_slug( sanitize_title( $data[\'post_title\'] ), $postarr[\'ID\'], $data[\'post_status\'], $data[\'post_type\'], $data[\'post_parent\'] );
    }

    return $data;
}
add_filter( \'wp_insert_post_data\', \'myplugin_update_slug\', 99, 2 );

SO网友:Adam

我已经预订了一段时间的东西如下(尚未测试),

Source LINK

//add our action
add_action( \'save_post\', \'my_save_post\', 11, 2 );

function my_save_post($post_id, $post){

   //if it is just a revision don\'t worry about it
   if (wp_is_post_revision($post_id))
      return false;

   //if the post is an auto-draft we don\'t want to do anything either
   if($post->post_status != \'auto-draft\' ){

       // unhook this function so it doesn\'t loop infinitely
       remove_action(\'save_post\', \'my_save_post\' );

      //this is where it happens -- update the post and change the post_name/slug to the post_title
      wp_update_post(array(\'ID\' => $post_id, \'post_name\' => str_replace(\' \', \'-\', $_POST[\'post_title\'])));

      //re-hook this function
      add_action(\'save_post\', \'my_save_post\' );
   }
}

结束

相关推荐

不使用_title()获取帖子的标题;

Noob问题。有没有其他方法可以不使用\\u title()获得帖子标题;我之所以这样问,是因为我正在使用一个函数take a string参数,然后在一些代码之后,返回这个字符串。当我传入_title()时;由于这个参数,由于某种原因,它不是以字符串的形式出现,因此,该方法失败。当我传入“some random string”而不是\\u title()时;该功能工作正常。有意义吗?