我在经营一个房产网站,很多房产都是在公寓楼里出售的。
因此,内容编辑器所做的就是创建一个包含所有详细信息的帖子/属性,然后使用一个重复的帖子插件来创建其他帖子。
每次他们复制一个帖子/属性时,他们都会更改标题以反映属性编号,可能还会更改一些元数据,例如价格。
他们忘了做的是删除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的段塞应始终自动生成,无需手动设置。
最合适的回答,由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网友: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\' );
}
}