В этом шаге мы создадим пользовательский интерфейс для управления записями базы знаний. Мы добавим новое меню «База знаний» в админ-панель WordPress и создадим страницу для отображения списка записей с возможностью поиска, фильтрации и сортировки.

  1. Создайте новый файл admin-page.php в папке includes плагина.
  2. Откройте файл admin-page.php и добавьте следующий код:
phpCopy code<?php

function akb_add_admin_menu() {
    add_menu_page(
        esc_html__( 'Knowledge Base', 'admin-knowledge-base' ),
        esc_html__( 'Knowledge Base', 'admin-knowledge-base' ),
        'edit_posts',
        'akb_knowledge_base',
        'akb_render_admin_page',
        'dashicons-book-alt',
        30
    );
}
add_action( 'admin_menu', 'akb_add_admin_menu' );

function akb_render_admin_page() {
    $current_page = isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
    $search_query = isset( $_GET['s'] ) ? sanitize_text_field( $_GET['s'] ) : '';

    $entries_per_page = akb_get_entries_per_page();

    $args = array(
        'post_type'      => 'knowledge_base',
        'posts_per_page' => $entries_per_page,
        'paged'          => $current_page,
        's'              => $search_query,
    );

    $query = new WP_Query( $args );
    ?>
    <div class="wrap">
        <h1 class="wp-heading-inline"><?php esc_html_e( 'Knowledge Base Entries', 'admin-knowledge-base' ); ?></h1>
        <a href="<?php echo esc_url( admin_url( 'post-new.php?post_type=knowledge_base' ) ); ?>" class="page-title-action"><?php esc_html_e( 'Add New', 'admin-knowledge-base' ); ?></a>
        <hr class="wp-header-end">

        <form method="get">
            <p class="search-box">
                <label for="akb-search-input"><?php esc_html_e( 'Search Entries', 'admin-knowledge-base' ); ?>:</label>
                <input type="search" id="akb-search-input" name="s" value="<?php echo esc_attr( $search_query ); ?>">
                <input type="hidden" name="page" value="akb_knowledge_base">
                <input type="submit" id="search-submit" class="button" value="<?php esc_attr_e( 'Search', 'admin-knowledge-base' ); ?>">
            </p>
        </form>

        <table class="wp-list-table widefat fixed striped">
            <thead>
                <tr>
                    <th scope="col"><?php esc_html_e( 'Title', 'admin-knowledge-base' ); ?></th>
                    <th scope="col"><?php esc_html_e( 'Author', 'admin-knowledge-base' ); ?></th>
                    <th scope="col"><?php esc_html_e( 'Date', 'admin-knowledge-base' ); ?></th>
                </tr>
            </thead>
            <tbody>
                <?php
                if ( $query->have_posts() ) :
                    while ( $query->have_posts() ) :
                        $query->the_post();
                        ?>
                        <tr>
                            <td>
                                <strong><a href="<?php echo esc_url( get_edit_post_link() ); ?>"><?php the_title(); ?></a></strong>
                                <div class="row-actions">
                                    <span class="edit"><a href="<?php echo esc_url( get_edit_post_link() ); ?>"><?php esc_html_e( 'Edit', 'admin-knowledge-base' ); ?></a> | </span>
                                    <span class="trash"><a href="<?php echo esc_url( get_delete_post_link() ); ?>"><?php esc_html_e( 'Trash', 'admin-knowledge-base' ); ?></a></span>
                                </div>
                            </td>
                            <td><?php the_author(); ?></td>
                            <td><?php echo esc_html( get_the_date() ); ?></td>
                        </tr>
                        <?php
                    endwhile;
                    wp_reset_postdata();
                else :
                    ?>
                    <tr>
                        <td colspan="3"><?php esc_html_e( 'No entries found.', 'admin-knowledge-base' ); ?></td>
                    </tr>
                    <?php
                endif;
                ?>
            </tbody>
        </table>

        <?php
        $total_pages = $query->max_num_pages;

        if ( $total_pages > 1 ) {
            $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
            $current_url = remove_query_arg( 'paged', $current_url );

            $pagination_args = array(
                'base'               => add_query_arg( 'paged', '%#%', $current_url ),
                'format'             => '',
                'total'              => $total_pages,
                'current'            => $current_page,
                'show_all'           => false,
                'end_size'           => 1,
                'mid_size'           => 2,
                'prev_next'          => true,
                'prev_text'          => __( '&laquo; Previous', 'admin-knowledge-base' ),
                'next_text'          => __( 'Next &raquo;', 'admin-knowledge-base' ),
                'type'               => 'plain',
                'add_args'           => false,
                'add_fragment'       => '',
                'before_page_number' => '',
                'after_page_number'  => '',
            );

            echo '<div class="pagination-links">' . paginate_links( $pagination_args ) . '</div>';
        }
        ?>
    </div>
    <?php
}

function akb_get_entries_per_page() {
    $options = get_option( 'akb_settings' );
    return isset( $options['entries_per_page'] ) ? absint( $options['entries_per_page'] ) : 10;
}
  1. Давайте разберем основные части этого кода:
    • akb_add_admin_menu(): Функция для добавления нового меню «База знаний» в админ-панель WordPress. Она использует функцию add_menu_page() для создания главной страницы меню и привязывает ее к функции akb_render_admin_page().
    • akb_render_admin_page(): Функция для отображения содержимого страницы «База знаний». Она выполняет запрос к базе данных для получения списка записей базы знаний с учетом текущей страницы, поиска и количества записей на странице. Затем она отображает таблицу со списком записей и элементы управления для поиска, пагинации и действий над записями.
    • akb_get_entries_per_page(): Вспомогательная функция для получения количества записей на странице из настроек плагина.
  2. Сохраните файл admin-page.php.
  3. Откройте главный файл плагина admin-knowledge-base.php и добавьте следующий код в конце файла:
phpCopy coderequire_once plugin_dir_path( __FILE__ ) . 'includes/admin-page.php';

Теперь у нас есть пользовательский интерфейс для управления записями базы знаний. Администраторы могут просматривать список записей, выполнять поиск, переходить к редактированию и удалению записей.

На следующем шаге мы реализуем функциональность создания, редактирования и удаления записей базы знаний.