¿Forzar la elección de categoría antes de crear una nueva publicación?

11

¿Cómo puedo obligar al usuario a elegir primero una categoría antes de continuar con el editor al crear una nueva publicación? Quiero establecer algún contenido predeterminado , pero esto se basa en la categoría, por lo que necesito saberlo antes de mostrar el editor (a menos que haga algunas cosas sofisticadas de Ajax, pero en este caso no quiero hacerlo).

Jan Fabry
fuente

Respuestas:

11

Resolví esto enganchándome post-new.phpy buscando un category_idparámetro de solicitud. Si no existe, visualizo un formulario con un menú desplegable de categoría que se envía nuevamente a esta página, y luego llamo exit()para que no se muestre el formulario de publicación regular. Si existe, configuro un gancho para wp_insert_posteso agregará la categoría. Esto funciona porque ya se ha creado una nueva publicación en la base de datos a través de la get_default_post_to_edit()función , y podemos agregar categorías, etiquetas u otro contenido (meta). El formulario se representa después de esto con el nuevo contenido "fresco".

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
fuente
Agradable. ¡Voy a necesitar hacer algo similar pronto y me he estado preguntando cómo lo haría!
MikeSchinkel
Lo siento, pero no funciona; agregué el texto en post-new.php pero no pasa nada. Algunas ideas ? Gracias
1
@kiro: No debe agregar este código post-new.php, sino en su tema functions.phpo en un archivo de complemento.
Jan Fabry
@ JanFabry Gran solución. Justo lo que estoy buscando. ¡Gracias!
rofflox
Gran parte del código que he estado usando en mi sitio múltiple para ayudar a agregar un estilo predeterminado a algunas categorías de publicaciones. Sin embargo, me encontré con un pequeño problema al usarlo en sitios con el increíble complemento "administrar", que arrojó un error de "tipo de publicación no válida". El autor del complemento sugirió comentar el "// extracto ($ GLOBALS);" línea y eso solucionó el problema.
speedypancake