Замена таблицы списка типа записи

Вопрос или проблема

Есть ли способ заменить объект WP_List_Table для типа записи, чтобы отображать этот тип записи иначе на странице редактирования Admin edit.php?

Нет, вы не можете заменить таблицу списка. Нет фильтра, все закодировано жестко.

Но вы можете изменить регистрацию типа записи, установить show_ui на FALSE, чтобы предотвратить создание встроенной страницы, и добавить пользовательскую страницу для списка типов записи, чтобы показать редактируемые элементы.

add_action( 'wp_loaded', function(){
    register_post_type(
        'test',
        array(
            'labels' => array(
                'name' => 'TEST'
            ),
            'public' => TRUE,
            'show_ui' => FALSE
        )
    );
});

add_action( 'admin_menu', function(){
    add_object_page(
        'TEST',
        'TEST',
        'edit_test',
        'test',
        function(){
            echo 'test'; // перечислите элементы типа записи здесь
        }
    );
});

Результат

скриншот

Этот пример применим к типу записи post. Это использует класс WP_Posts_List_Table и фильтр views-edit-{$post_type}. Это, кажется, не лучший способ, но это работает:

Убедитесь, что класс загружен на вашей странице:

if(!class_exists('WP_List_Table')){
    require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}
if(!class_exists('WP_Posts_List_Table')){
    require_once( ABSPATH . 'wp-admin/includes/class-wp-posts-list-table.php' );
}

Расширьте класс WP_Posts_List_Table, чтобы удалить таблицу списка и определить содержимое:

class wpse_CustomTable extends WP_Posts_List_Table
{       
    // удалить поле поиска
    public function search_box( $text, $input_id ){ }

    // Ваша пользовательская таблица здесь
    public function display() {
        echo "Test";
    }
}

Используйте это внутри фильтра:

// подключение к `views-edit`
add_filter( 'views_edit-post',  "sstssfb_custom_list_table");    
// Переопределение объекта таблицы постов
function sstssfb_custom_list_table() {
    global $wp_list_table;
    $mylisttable = new wpse_CustomTable();
    $wp_list_table = $mylisttable ;    
}

Результат:

вставьте описание изображения здесь

  1. С версии WordPress 6.1 можно переопределить имя класса, используемое для инстанциации WP List Table, отображаемой в административной панели для конкретного типа записи или страницы.

Вам просто нужно добавить фильтр wp_list_table_class_name:

add_filter('wp_list_table_class_name', function($class_name, $args)
{
    // Используйте обычную функцию get_current_screen, чтобы решить, какой класс загрузить
    return( 'My_New_Class_Name');
    // или return( $class_name ); если хотите сохранить первоначальный выбор WordPress
}, 10, 2);

https://developer.wordpress.org/reference/functions/_get_list_table/

Ответ или решение

Замена списка таблицы постов в WordPress: полное руководство

Введение

В рамках администрирования WordPress может возникнуть необходимость изменить стандартное представление списка постов определенного типа. Стандартная таблица WP_List_Table, отображающая элементы в разделе edit.php, является основным объектом для управления контентом в админ-панели. Однако, как показывает практика, возможности её замены или переопределения ограничены. В этой статье мы рассмотрим, как можно подойти к изменению отображения списка в пределах возможностей WordPress, сохраняя при этом целостность системы.

Почему нельзя просто заменить таблицу?

Как замечено в исходном описании проблемы, WordPress не предоставляет фильтры для полной замены объекта WP_List_Table в рамках административной панели. Все элементы жестко закодированы в основных файлах WordPress. Однако разработчики могут использовать альтернативные подходы, чтобы достичь своих целей.

Подходы к изменению отображения списка

1. Деактивирование стандартного интерфейса

Вы можете отключить стандартный интерфейс для вашего типа поста, установив параметр show_ui в FALSE при регистрации типа поста. Затем можно создать свою собственную страницу для отображения вашего пользовательского списка постов.

add_action('wp_loaded', function() {
    register_post_type('test', array(
        'labels' => array('name' => 'TEST'),
        'public' => TRUE,
        'show_ui' => FALSE
    ));
});

add_action('admin_menu', function() {
    add_object_page(
        'TEST',
        'TEST',
        'edit_test',
        'test',
        function() {
            echo 'test'; // Замените этот текст на ваш код для списка постов
        }
    );
});

Это решение довольно простое, но эффективное для создания пользовательского интерфейса.

2. Расширение класса WP_Posts_List_Table

Для более сложных случаев можно успеть расширить класс WP_Posts_List_Table и изменить методы отображения, если вы хотите модифицировать стандартное поведение:

if(!class_exists('WP_List_Table')) {
    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
}
if(!class_exists('WP_Posts_List_Table')) {
    require_once(ABSPATH . 'wp-admin/includes/class-wp-posts-list-table.php');
}

class wpse_CustomTable extends WP_Posts_List_Table {
    public function search_box($text, $input_id) { }

    public function display() {
        echo "Тест"; // Здесь вы можете отобразить ваш пользовательский контент
    }
}

// Подключаем наш класс вместо стандартного
add_filter('views_edit-post', 'sstssfb_custom_list_table');    

function sstssfb_custom_list_table() {
    global $wp_list_table;
    $wp_list_table = new wpse_CustomTable();    
}

Это решение позволяет вам внедрить собственные изменения в стандартную таблицу, включая удаление поискового поля или добавление новых колонок.

3. Использование фильтра wp_list_table_class_name

С версии WordPress 6.1 разработчики могут переопределить класс, используемый для создания WP List Table для конкретного типа поста, применив фильтр wp_list_table_class_name.

add_filter('wp_list_table_class_name', function($class_name, $args) {
    // Определяем класс для загрузки на основе текущего экрана
    return 'My_New_Class_Name'; // Замените на имя вашего класса
}, 10, 2);

Заключение

Хотя стандартная таблица WP_List_Table не может быть заменена напрямую, есть несколько подходов, которые позволяют кастомизировать интерфейс управления постами в WordPress. Выбор метода зависит от ваших требований и желаемой степени изменения интерфейса.

Постарайтесь выбирать метод, который соответствует вашей задаче, и тестируйте внесенные изменения, чтобы избежать потенциальных конфликтов в браузере администрирования WordPress. Внедрение пользовательских решений в WordPress требует осторожности, но это может значительно улучшить опыт работы пользователей с вашим сайтам.

Оцените материал
Добавить комментарий

Капча загружается...