Lựa chọn thể loại trước khi tạo bài mới?


11

Làm cách nào tôi có thể buộc người dùng trước tiên chọn một danh mục trước khi tiếp tục trình chỉnh sửa khi tạo bài đăng mới? Tôi muốn đặt một số nội dung mặc định , nhưng điều này dựa trên danh mục, vì vậy tôi cần biết rằng trước khi hiển thị trình soạn thảo (trừ khi tôi thực hiện một số nội dung Ajax ưa ​​thích, nhưng trong trường hợp này tôi không muốn làm điều đó).

Câu trả lời:


11

Tôi đã giải quyết điều này bằng cách nối vào post-new.phpvà kiểm tra category_idtham số yêu cầu. Nếu nó không tồn tại, tôi sẽ hiển thị một biểu mẫu với danh sách thả xuống thể loại gửi lại trang này và sau đó gọi exit()để biểu mẫu bài đăng thông thường không hiển thị. Nếu nó tồn tại, tôi thiết lập một hook cho wp_insert_postnó sẽ thêm thể loại. Này hoạt động vì một bài mới đã được tạo ra trong cơ sở dữ liệu thông qua các get_default_post_to_edit()chức năng , và chúng ta có thể thêm các danh mục, thẻ hoặc khác (meta) nội dung. Biểu mẫu được hiển thị sau này với nội dung mới "mới".

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

Đẹp. Tôi sẽ cần phải làm một cái gì đó tương tự sớm và đã tự hỏi làm thế nào tôi sẽ làm điều đó!
MikeSchinkel

Xin lỗi, nhưng nó không hoạt động - Tôi đã thêm văn bản trong post-new.php nhưng không có gì xảy ra. Có ý kiến ​​gì không? Cảm ơn

1
@kiro: Bạn không nên thêm mã này vào post-new.php, nhưng trong chủ đề của bạn functions.phphoặc trong tệp plugin.
Jan Fabry

@JanFabry Giải pháp tuyệt vời. Chỉ là những gì tôi đang tìm kiếm. Cảm ơn!
rofflox

Rất nhiều mã tôi đã sử dụng nó trong multisite của mình để giúp thêm một số kiểu mặc định vào một số danh mục bài đăng. Tôi đã gặp phải một vấn đề nhỏ khi sử dụng nó trên các trang web có plugin "adminizing" tuyệt vời, điều này đã gây ra lỗi "loại bài đăng không hợp lệ". Tác giả plugin đã đề xuất nhận xét "// extract ($ GLOBALS);" dòng & đã khắc phục vấn đề.
speedypancake
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.