janfabry
  • 0
Гуру

Принудительно выбрать категорию перед созданием нового сообщения?

  • 0

Как я могу заставить пользователя сначала выбрать категорию, прежде чем перейти в редактор при создании нового сообщения? Я хочу установить некоторый контент по умолчанию, но это основано на категории, поэтому мне нужно знать это, прежде чем показывать редактор (если только я не делаю какие-то причудливые вещи Ajax, но в этом случае я не хочу этого делать).

Share
  1. Я решил это, подключившись к post-new.php и проверив category_id параметр запроса. Если он не существует, я показываю форму с выпадающим списком категорий, который отправляет обратно на эту страницу, а затем вызываю exit(), чтобы обычная форма сообщения не отображалась. Если он существует, я настроил хук wp_insert_post, который добавит категорию. Это работает, потому что новый пост уже создан в базе данных с помощью функции get_default_post_to_edit(), и мы можем добавить категории, теги или другой (мета) контент. После этого форма визуализируется с «свежим» новым содержанием.

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

Оставить ответ

You must login to add an answer.