我正在创建一个系统,其中正在准备一些自定义的帖子草稿,在版主采取某些操作后,它将自动发布。
因此,首先,我创建如下的后期草稿:
$newpost = array(
\'post_title\' => \'Raport \'.date("Y-m-d"),
\'post_content\' => \'Add your content here\',
\'post_type\' => \'raport\',
\'post_status\' => \'draft\',
\'post_author\' => $userid
);
wp_insert_post($newpost);
该草案等待管理员采取一些行动。它可以编辑等,并在编辑页面上的永久链接设计的这篇文章是确定的。
管理员执行某些操作后,系统会自动发布帖子:
wp_publish_post($id);
但在那之后,《华盛顿邮报》的永久链接被打破了。而不是标准的permalink(在编辑页面上可见):
http://my-website.pl/raport/post-slug-name
帖子的永久链接
wp_publish_post
看起来是这样的:
http://my-website.pl/raport/
它指向自定义帖子的类型存档页面,而不是帖子本身。
我如何在不破坏永久链接的情况下修复并发布这些帖子?
最合适的回答,由SO网友:David 整理而成
虽然函数的名称wp_publish_post()
建议可以使用它来发布帖子,但显然不应使用它以编程方式发布帖子草稿。
这样做的方法是使用wp_update_post()
并手动将post状态设置为publish
:
<?php
// Update post with the ID 42
$postData = [ \'ID\' => 42, \'post_status\' => \'publish\' ];
wp_update_post( $postData );
这将为
post_name
字段,因此是一个适当的永久链接。
功能wp_publish_post()
WordPress仅用于在计划挂钩期间发布将来的帖子(请参阅check_and_publish_future_post()
). 这不会打破永久链接的原因是,发布状态future
已具有的有效值post_name
创建人wp_insert_post()
.
SO网友:DrewAPicture
当草稿发布时,permalink会根据帖子的标题重写。起初我想也许你可以用$original_slug
中的参数wp_unique_post_slug
过滤器,但很快发现它在测试中不可靠。
如果您有一种在全局范围内持久化草稿slug的方法(例如通过类属性或全局),那么您应该能够在发布时通过wp_unique_post_slug
用这样的东西钩住:
/**
* Ensure the draft slug carries through when publishing a draft post.
*
* @param string $slug New post slug from title.
* @param int $post_ID Post ID.
* @param string $post_status New post status.
* @param string $post_type Post type.
* @param int $post_parent Post parent ID.
* @param string $original_slug Original post slug.
* @return string (maybe) filtered post slug.
*/
function wpdocs_restore_slug_on_publish( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
if ( $slug !== \'your-draft-slug\' ) {
$slug = \'your-draft-slug\';
}
return $slug;
}
add_filter( \'wp_unique_post_slug\', \'wpdocs_restore_slug_on_publish\', 10, 6 );