Forçar a escolha da categoria antes de criar uma nova postagem?

11

Como forçar o usuário a escolher uma categoria antes de continuar com o editor ao criar uma nova postagem? Eu quero definir algum conteúdo padrão , mas isso é baseado na categoria, então eu preciso saber isso antes de mostrar o editor (a menos que eu faça algumas coisas sofisticadas do Ajax, mas nesse caso eu não quero fazer isso).

Jan Fabry
fonte

Respostas:

11

Resolvi isso conectando post-new.phpe verificando um category_idparâmetro de solicitação. Se ele não existir, eu exibo um formulário com uma lista suspensa de categorias que é enviada de volta a esta página e depois chamo exit()para que o formulário de postagem normal não seja exibido. Se existir, configurei um gancho para wp_insert_postadicionar a categoria. Isso funciona porque uma nova postagem já foi criada no banco de dados por meio da get_default_post_to_edit()função , e podemos adicionar categorias, tags ou outro (meta) conteúdo. O formulário é renderizado depois disso com o novo conteúdo "novo".

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'] );
}
Jan Fabry
fonte
Agradável. Vou precisar fazer algo semelhante em breve e me pergunto como eu faria isso!
MikeSchinkel
Desculpe, mas não está funcionando - adicionei o texto no post-new.php, mas nada acontece. Alguma ideia ? Graças
1
@ kiro: Você não deve adicionar esse código post-new.php, mas no seu tema functions.phpou em um arquivo de plug-in.
Jan Fabry
@JanFabry Ótima solução. Apenas o que estou procurando. Obrigado!
Rofflox
Grande parte do código que tenho usado no meu multisite para ajudar a adicionar um estilo padrão a algumas categorias de post. Eu encontrei um pequeno problema ao usá-lo em sites com o incrível plug-in "adminimize", que gerou um erro "tipo de postagem inválido". O autor do plugin sugeriu comentar o "// extract ($ GLOBALS);" linha e que resolveu o problema.
speedypancake