web-dev-qa-db-fra.com

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

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 dépend de la catégorie. Je dois donc le savoir avant d'afficher l'éditeur (à moins que je ne fasse des trucs fantaisistes sur Ajax, mais dans ce cas, je ne veux pas le faire. cette).

11
Jan Fabry

J'ai résolu ce problème en m'accrochant à post-new.php et en recherchant un paramètre de requête category_id. S'il n'existe pas, j'affiche un formulaire avec une liste déroulante de catégories à renvoyer à cette page, puis appelle exit() afin que le formulaire de publication standard ne s'affiche pas. Si cela existe, je mets en place un hook pour wp_insert_post qui ajoutera la catégorie. Cela fonctionne car un nouveau message est déjà créé dans la base de données via la fonction get_default_post_to_edit() , et nous pouvons ajouter des catégories, des balises ou un autre contenu (méta). Le formulaire est ensuite rendu 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'] );
}
10
Jan Fabry