这是一个部分的答案,因为正如我在评论中提到的,我不知道为什么您的代码现在需要两个“非常糟糕的词”。这也是一次未经测试的尝试
我来回答你的第一个问题:how to send a user back to the posts page and display a suitable error message, rather than an error about editing posts in the trash.
要做到这一点,我想到的一种方法是wp_redirect() 使用自定义querystring参数,然后可以使用检测并显示错误消息admin_notices action.
然而,我们不能立即重定向,因为我们需要wp_insert_post_data
钩子先完成它的工作。查看source, 我们可能会在wp_insert_post()
函数,在save_post
或wp_insert_post
行动。在这一阶段,我们还需要一种方法来检查是否需要重定向,我们可以通过检查post_status
是\'trash\'
如果是一个新帖子(因为什么时候新帖子会被丢弃?)。
以下是一个潜在的工作流:
// if this is a new post but it\'s in the trash, redirect with a custom error
add_action( \'wp_insert_post\', \'wpse_215752_redirect_from_trash\', 10, 3 );
function wpse_215752_redirect_from_trash( $post_ID, $post, $update ) {
if( !$update && \'trash\' === $post->post_status ) {
wp_redirect( admin_url( \'edit.php?custom_error=badwords\' ) );
die();
}
}
// if our custom error is set in the querystring, make sure we show it
if( isset( $_GET[\'custom_error\'] ) && \'badwords\' === $_GET[\'custom_error\']) {
add_action( \'admin_notices\', \'wpse_215752_badwords_error\' );
}
function wpse_215752_badwords_error() {
$class = \'notice notice-error\';
$message = __( \'Sorry, that post cannot be made.\', \'your-text-domain\' );
printf( \'<div class="%1$s"><p>%2$s</p></div>\', $class, $message );
}
提醒你,我还没有测试过这个,但我相信这会给你一些开始的东西!
其他的选择可能包括wp_transition_post_status
actions, 尤其new_to_trash
, 通过查看来源,在您的情况下也应该调用它。
最后,如果我是一个用户,我可能希望有机会编辑我的帖子,而不是让它自动被丢弃,但这是您的用户体验决定。
Disclaimer: 这可能不一定是最好的方法,但我希望它能给你一些方向,如果有更好的方法,也许其他人可以插话。