问题描述

我正在经营一个物业网点,许多物业都在公寓楼内出售。

因为这样的内容,编辑者做的是创建一个包含所有细节的 post /property,然后使用一个重复的 post plugin 来创建其他的。

每次他们复制一个帖子/财产,他们更改标题以反映属性编号,也许更改几个元数据 E.G 价格。

他们忘记做的是擦掉 s lug 声,并从标题中产生一个新的。这是从第一个属性输入的一个例子:

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

但是当他们复制的 s s 变成:

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

但是当他们改变标题时,lug 子会更好:

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

所以我的问题:

How do I force the slug to be re-generated on post save, after they have updated the property title?

这个 CPT 的插头应该始终是自动生成的,从不需要手动设置它。

最佳解决方案

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

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 );

次佳解决方案

另外,从 sanitize_title_with_dashes()通过 wp_unique_post_slug()运行 slug 以确保它是唯一的。如果需要,它将自动附加’-2’,’-3’ 等。

第三种解决方案

而不是替换空格,您应该使用功能 sanitize_title()的构建,这将为您处理更换。

喜欢这个:

sanitize_title( $post_title, $post->ID );

此外,您应该使用独特的 s 。。您可以使用 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 );

第四种方案

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

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' );
   }
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。