Forcer le choix de catégorie avant de créer un nouveau poste?


11

Comment puis-je forcer l'utilisateur à choisir d'abord une catégorie avant de passer à l'éditeur lors de la création d'un nouveau message? Je veux définir du contenu par défaut , mais cela est basé sur la catégorie, donc je dois le savoir avant de montrer l'éditeur (sauf si je fais des trucs Ajax fantaisistes, mais dans ce cas, je ne veux pas le faire).

Réponses:


11

J'ai résolu cela en se connectant post-new.phpet en vérifiant un category_idparamètre de demande. S'il n'existe pas, j'affiche un formulaire avec une liste déroulante de catégories qui renvoie à cette page, puis appelle exit()pour que le formulaire de publication normal ne s'affiche pas. Si elle existe, j'ai mis en place un hook wp_insert_postqui ajoutera la catégorie. Cela fonctionne car un nouveau message est déjà créé dans la base de données via la get_default_post_to_edit()fonction , et nous pouvons ajouter des catégories, des balises ou d'autres (méta) contenus. Le formulaire est rendu après cela avec le nouveau contenu "frais".

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

Agréable. Je vais devoir bientôt faire quelque chose de similaire et je me demandais comment je le ferais!
MikeSchinkel

Désolé, mais cela ne fonctionne pas - j'ai ajouté le texte dans post-new.php mais rien ne se passe. Des idées ? Merci

1
@kiro: Vous ne devez pas ajouter ce code dans post-new.php, mais dans votre thème functions.phpou dans un fichier de plugin.
Jan Fabry

@JanFabry Excellente solution. Exactement ce que je recherche. Merci!
rofflox

Beaucoup de code que j'ai utilisé dans mon multisite pour aider à ajouter un style par défaut à certaines catégories de messages. J'ai cependant rencontré un léger problème lors de son utilisation sur des sites avec l'incroyable plugin "adminimize", qui a généré une erreur "type de message non valide". L'auteur du plugin a suggéré de commenter "// extract ($ GLOBALS);" ligne & qui a résolu le problème.
speedypancake
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.