在创建新帖子之前强制选择类别?


11

创建新帖子时,如何强制用户先选择类别,然后再继续编辑?我想设置一些默认内容,但这是基于类别的,所以我需要在显示编辑器之前知道这一点(除非我做一些花哨的Ajax东西,但在这种情况下,我不想这样做)。

Answers:


11

我通过挂钩post-new.php并检查category_id请求参数来解决此问题。如果它不存在,我将显示一个带有类别下拉列表的表单,该表单将提交回到此页面,然后进行调用,exit()因此不会显示常规的张贴表单。如果存在,我为此设置一个钩子wp_insert_post,以添加类别。这工作,因为一个新的职位是通过该数据库已经创建get_default_post_to_edit()功能,我们可以添加类别,标签,或其他(元)的内容。此后,将使用“新”新内容来呈现表单。

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'] );
}

真好 我将需要尽快做类似的事情,并且一直想知道我会怎么做!
MikeSchinkel 2011年

抱歉,它不能正常工作-我在post-new.php中添加了文本,但没有任何反应。有任何想法吗 ?谢谢

1
@kiro:您不应post-new.php在主题主题functions.php或插件文件中添加此代码。
Jan Fabry

@JanFabry很棒的解决方案。正是我想要的。谢谢!
rofflox 2012年

我在多站点中一直在使用大量代码来帮助向某些帖子类别添加一些默认样式。我在带有惊人的“ adminimize”插件的网站上使用它时确实遇到了一个小问题,它引发了“ invalid post type”错误。插件作者建议注释掉 “ // extract($ GLOBALS);”。行和解决了这个问题。
speedypancake
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.