首先请注意,一篇文章可以有多个类别,也可以没有类别,在这种情况下你会怎么做?
更新后呢?
也就是说,如果你在edit.php
并通过单击其名称来选择一个类别,您会注意到url中唯一更改的是category_name
附加到url。通过使用get_the_category
并使用add_query_arg
.
我假设:
如果帖子有多个类别,请使用第一个类别如果帖子没有类别,请重定向到edit.php
没有任何类别过滤器如果post状态为“draft”,则不会触发重定向如果帖子被删除,请重定向到垃圾站
如果帖子更新,您将以同样的方式行事,因此:add_action( \'wp_insert_post\', function( $post_ID, $post, $update ) {
if ( defined(\'DOING_AJAX\') && DOING_AJAX ) return;
if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) return;
if ( $post->post_type !== \'post\' ) return;
if ( in_array($post->post_status, array(\'draft\',\'auto-draft\',\'inherit\') ) ) return;
$url = add_query_arg( array( \'post_type\'=>\'post\' ), admin_url(\'edit.php\') );
if ( $post->post_status === \'trash\' ) {
$args = array(\'post_status\' => \'trash\', \'trashed\' => \'1\', \'ids\' => $post_ID );
$redirect = add_query_arg( $args, $url );
wp_safe_redirect( $redirect );
exit();
}
$url = add_query_arg( array( \'pid\' => $post_ID ), $url );
// uncomment following line to avoid redirect on post update
// if ($update) return;
$cats = get_the_category( $post_ID );
if ( empty( $cats ) ) {
wp_safe_redirect( $url );
exit();
}
$cat = array_shift( $cats );
$args = array( \'category_name\' => $cat->slug, \'msg\' => \'updated\' );
$redirect = add_query_arg( $args, $url );
wp_safe_redirect( $redirect );
exit();
}, PHP_INT_MAX, 3);
我用过\'wp_insert_post\'
具有最高优先级,因为它是保存帖子时最后一个激发的钩子。以这种方式保存通常在上运行的自定义元数据库的代码save_post
, 应该可以正常工作,因为钩子是先触发的。然而,这方面的问题是:
重定向后,在中仅显示一个类别时,您将不再看到“post updated”消息edit.php
过滤器乍一看不是很明显,这可能会让用户感到困惑。出于这些原因,我想分享一种正确显示消息的方法,使重定向后的编辑页面更加清晰:
add_action(\'admin_notices\', function() {
$screen = get_current_screen();
if ( $screen->id !== \'edit-post\' ) return;
$pid = (int) filter_input( INPUT_GET, \'pid\', FILTER_SANITIZE_NUMBER_INT );
if ( ! $pid > 0 ) return;
$msg = filter_input( INPUT_GET, \'msg\', FILTER_SANITIZE_STRING );
if ( $msg === \'updated\' ) {
echo \'<div class="updated"><p>\';
printf(
__(\'Post updated. <a href="%s">View post</a>\'), esc_url( get_permalink($pid) )
);
echo \'</p></div>\';
}
$cat = filter_input( INPUT_GET, \'category_name\', FILTER_SANITIZE_STRING );
if( ! empty($cat) ) {
$term = get_term_by( \'slug\', $cat, \'category\' );
if ( empty( $term ) ) return;
$c = get_taxonomy( \'category\' );
$cname = esc_html( $c->labels->singular_name );
echo \'<div class="updated"><p>\';
$all = add_query_arg( array( \'post_type\'=>\'post\' ), admin_url(\'edit.php\') );
$f = \'%s <strong>"%s"</strong>. <a href="%s">%s</a>\';
printf( $f, $cname, esc_html($term->name), esc_url($all), __(\'All Posts\') );
echo \'</p></div>\';
}
});