Forza la scelta della categoria prima di creare un nuovo post?


11

Come posso forzare l'utente a scegliere prima una categoria prima di continuare con l'editor quando crea un nuovo post? Voglio impostare alcuni contenuti predefiniti , ma questo è basato sulla categoria, quindi devo saperlo prima di mostrare l'editor (a meno che non faccia delle cose fantasiose Ajax, ma in questo caso non voglio farlo).

Risposte:


11

Ho risolto questo problema collegandomi post-new.phpe verificando un category_idparametro di richiesta. Se non esiste, visualizzo un modulo con un menu a discesa di categoria che torna a questa pagina, quindi chiamo in exit()modo che il normale modulo di posta non venga visualizzato. Se esiste, ho impostato un hook per wp_insert_postaggiungere la categoria. Questo funziona perché un nuovo post è già stato creato nel database tramite la get_default_post_to_edit()funzione e possiamo aggiungere categorie, tag o altro (meta) contenuto. Il modulo viene reso dopo questo con il nuovo contenuto "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'] );
}

Bello. Presto dovrò fare qualcosa di simile e mi chiedo come lo farei!
MikeSchinkel,

Scusa, ma non funziona - ho aggiunto il testo in post-new.php ma non succede nulla. Qualche idea ? Grazie

1
@kiro: non dovresti aggiungere questo codice post-new.php, ma nel tuo tema functions.phpo in un file plugin.
Jan Fabry,

@JanFabry Ottima soluzione. Proprio quello che sto cercando. Grazie!
rofflox,

Un bel po 'di codice lo sto usando nel mio multisito per aiutare ad aggiungere uno stile predefinito ad alcune categorie di post. Mi sono imbattuto in un leggero problema durante l'utilizzo su siti con l'incredibile plug-in "adminimize", che ha generato un errore "tipo post non valido". L'autore del plugin ha suggerito di commentare "// extract ($ GLOBALS);" linea e che risolto il problema.
speedypancake l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.