问题描述
创建新帖子之前,如何强制用户先继续编辑之前先选择一个类别?我想要 set some default content,但是这是基于类别,所以我需要知道,在显示编辑器之前 (除非我做了一些奇怪的 Ajax 的东西,但在这种情况下我不想这样做) 。
最佳解决方案
我通过挂接到 post-new.php
并检查 category_id
请求参数来解决这个问题。如果不存在,我会显示一个带有类别下拉列表的表单,提交给该页面,然后调用 exit()
,以便不显示常规的表单。如果存在,我将为 wp_insert_post
设置一个钩子,将添加该类别。这是因为通过 get_default_post_to_edit()
函数在数据库中创建了一个新帖子,我们可以添加类别,标签或其他 (元) 内容。此后,使用”fresh” 新内容生成表单。
add_filter( 'load-post-new.php', 'wpse14403_load_post_new' );
function wpse14403_load_post_new()
{
$post_type = 'post';
if ( isset( $_REQUEST['post_type'] ) ) {
$post_type = $_REQUEST['post_type'];
}
// Only do this for posts
if ( 'post' != $post_type ) {
return;
}
if ( array_key_exists( 'category_id', $_REQUEST ) ) {
add_action( 'wp_insert_post', 'wpse14403_wp_insert_post' );
return;
}
// Show intermediate screen
extract( $GLOBALS );
$post_type_object = get_post_type_object( $post_type );
$title = $post_type_object->labels->add_new_item;
include( ABSPATH . 'wp-admin/admin-header.php' );
$dropdown = wp_dropdown_categories( array(
'name' => 'category_id[]',
'hide_empty' => false,
'echo' => false,
) );
$category_label = __( 'Category:' );
$continue_label = __( 'Continue' );
echo <<<HTML
<div class="wrap">
<h2>{$title}</h2>
<form method="get">
<table class="form-table">
<tbody>
<tr valign="top">
<th scope="row">{$category_label}</th>
<td>{$dropdown}</td>
</tr>
<tr>
<td></td>
<th><input name="continue" type="submit" class="button-primary" value="{$continue_label}" /></th>
</tbody>
</table>
<input type="hidden" name="post_type" value="{$post_type}" />
</form>
</div>
HTML;
include( ABSPATH . 'wp-admin/admin-footer.php' );
exit();
}
// This function will only be called when creating an empty post,
// via `get_default_post_to_edit()`, called in post-new.php
function wpse14403_wp_insert_post( $post_id )
{
wp_set_post_categories( $post_id, $_REQUEST['category_id'] );
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。