Paksa pilihan kategori sebelum membuat posting baru?

11

Bagaimana saya bisa memaksa pengguna untuk memilih kategori terlebih dahulu sebelum melanjutkan ke editor ketika membuat posting baru? Saya ingin mengatur beberapa konten default , tetapi ini didasarkan pada kategorinya, jadi saya perlu tahu bahwa sebelum menampilkan editor (kecuali saya melakukan hal-hal yang disukai Ajax, tetapi dalam hal ini saya tidak ingin melakukan itu).

Jan Fabry
sumber

Jawaban:

11

Saya memecahkan ini dengan menghubungkan ke post-new.php, dan memeriksa category_idparameter permintaan. Jika tidak ada, saya menampilkan formulir dengan dropdown kategori yang mengirimkan kembali ke halaman ini, dan kemudian memanggil exit()sehingga formulir posting biasa tidak ditampilkan. Jika ada, saya mengatur pengait untuk wp_insert_postitu akan menambahkan kategori. Ini bekerja karena posting baru sudah dibuat dalam database melalui para get_default_post_to_edit()fungsi , dan kita dapat menambahkan kategori, tag, atau lainnya (meta) konten. Formulir diberikan setelah ini dengan konten baru "segar".

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
sumber
Bagus. Saya harus segera melakukan hal serupa dan bertanya-tanya bagaimana saya akan melakukannya!
MikeSchinkel
Maaf, tetapi tidak berfungsi - saya menambahkan teks di post-new.php tetapi tidak ada yang terjadi. Ada ide? Terima kasih
1
@kiro: Anda seharusnya tidak menambahkan kode ini post-new.php, tetapi dalam tema Anda functions.phpatau dalam file plugin.
Jan Fabry
@ JanFabry Solusi hebat. Apa yang saya cari. Terima kasih!
rofflox
Sedikit kode hebat yang telah saya gunakan di multisite saya untuk membantu menambahkan beberapa style default ke beberapa kategori posting. Saya memang mengalami sedikit masalah ketika menggunakannya di situs-situs dengan plugin "adminimize" yang luar biasa, yang menimbulkan kesalahan "tipe posting tidak valid". Pengaya plugin menyarankan mengomentari "// ekstrak ($ ​​GLOBALS);" baris & yang memperbaiki masalah.
speedypancake