✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Как изменить или добавить пользовательские столбцы в список сообщений в админке WordPress

104

WordPress позволяет вам изменять и добавлять столбцы в список сообщений, страниц или любого пользовательского типа сообщений в панели администратора. В этом посте мы рассмотрим как!

Как изменить или добавить пользовательские столбцы в список сообщений в админке WordPress

Есть два хука, которые следует учитывать: один фильтр для позиции и заголовка столбца и одно действие для вывода столбца для каждого сообщения. Тип поста является частью имен хуков. Давайте рассмотрим их один за другим, начиная с фильтра.

Фильтр столбца

Фильтр для изменения, удаления или добавления столбцов в список сообщений в панели администратора WordPress — manage_{$post_type}_posts_columns. Обмен {$post_type}с желаемым типом поста. Например; если вы хотите редактировать столбцы для типа сообщения ‘ post‘, имя фильтра будет manage_post_posts_columns. А для пользовательского типа сообщения ‘ product‘ имя фильтра будет manage_product_posts_columns.

PS: WordPress имеет фильтр столбца исключительно для типа записи ‘ page‘: manage_pages_columns, но вы добьетесь того же результата, используя фильтр manage_page_posts_columns.

В качестве аргумента фильтра вы получаете полный массив всех столбцов для этого типа записи. Каждый столбец имеет уникальный ключ, а их значения — это метки, показанные в заголовке столбца. Примеры ключей: ‘ cb‘ для столбца флажка и ‘ title‘ для столбца заголовка сообщения. Порядок элементов в массиве определяет порядок столбцов.

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

Хук содержимого столбца

Какой хук вам нужно использовать для управления выводом содержимого столбца, зависит от того, установлен ли ваш тип сообщения как иерархический или нет. Иерархический тип записи был определен как 'hierarchical' => trueв файле register_post_type. Любые неиерархические типы сообщений, включая встроенный тип сообщений WordPress post, используют имя хука manage_{$post_type}_custom_column. Любые иерархические типы сообщений, включая встроенный тип сообщений WordPress ‘ page‘, используют имя хука manage_pages_custom_column(примечание: не вводить имя типа сообщения в имя хука).

В качестве аргументов для этого хука вы получаете имя столбца, который является ключом, упомянутым в фильтре столбца выше (например, ‘ cb‘ для столбца флажка), и, во-вторых, идентификатор сообщения. Этот хук запускается для каждого поста, и основная предпосылка заключается в том, что вы проверяете, находимся ли мы в правильном типе столбца (по ключу), и если да, используйте идентификатор поста для получения метаданных поста или чего-то подобного и выводите то, что ты хочешь.

Примеры

Давайте посмотрим на код практических примеров.

Добавьте настраиваемый столбец к сообщениям, который отображает настраиваемые метаданные сообщения.

Это самый простой способ добавления настраиваемых столбцов. Допустим, мы хотим добавить настраиваемый столбец в сообщение типа «сообщение». Мы хотим, чтобы он находился в самом конце столбцов под названием «Проверено», и он должен выводить «Да» или «Нет» в зависимости от пользовательского мета-значения записи. Примечание. Этот пример не включает сохранение или обновление пользовательской мета-записи.

В нашей functions.phpили где угодно в нашей теме или коде плагина мы добавим сам столбец, объединив его с массивом столбцов, а в хуке для вывода столбца мы получим значение метаданных сообщения и выведем его.

add_filter('manage_post_posts_columns', function($columns) {
    return array_merge($columns, ['verified' => __('Verified', 'textdomain')]);
});
 
add_action('manage_post_posts_custom_column', function($column_key, $post_id) {
    if ($column_key == 'verified') {
        $verified = get_post_meta($post_id, 'verified', true);
        if ($verified) {
            echo '<span style="color:green;">'; _e('Yes', 'textdomain'); echo '</span>';
        } else {
            echo '<span style="color:red;">'; _e('No', 'textdomain'); echo '</span>';
        }
    }
}, 10, 2);

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

Добавьте настраиваемый столбец в иерархический настраиваемый тип записи, в котором отображается запись его предка.

Когда тип записи является иерархическим, записи могут иметь родительские записи. Допустим, у нас есть иерархический настраиваемый тип постов subjectдля школьных предметов, где принято делать много постов для детей и даже постов для детей. Для лучшего обзора мы хотим добавить столбец, отображающий родителя-предка сообщения («корневая тема»). Если сообщение является сообщением верхнего уровня, отображается простой «-», в противном случае столбец выводит заголовок родительского сообщения предка в ссылке для редактирования сообщения.

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

Этот код также показывает пример того, как вставить столбец в середину массива столбцов. Мы определяем, что наш столбец должен располагаться перед ‘author’, и используем функции массива PHP для вставки элемента в правильное положение.

add_filter('manage_subject_posts_columns', function($columns) {
    $offset = array_search('author', array_keys($columns));
    return array_merge(array_slice($columns, 0, $offset), ['ancestor' => __('Ancestor', 'textdomain')], array_slice($columns, $offset, null));
});
 
add_action('manage_pages_custom_column', function($column_key, $post_id) {
    if ($column_key == 'ancestor') {
        $ancestors = get_ancestors($post_id, 'subject', 'post_type');
        $post_ancestor = end($ancestors);
        if ($post_ancestor != 0) {
            echo '<a href="'. get_edit_post_link($post_ancestor). '">'. get_the_title($post_ancestor). '</a>';
        } else {
            echo '-';
        }
    }
}, 10, 2);

Удаление столбца

Удалить столбец из типа записи довольно просто; все, что вам нужно, это отфильтровать столбцы сообщений, удалить элемент из массива и вернуть его. Вам не нужно подключаться к выходному крючку столбца. Например; удаление dateстолбца по умолчанию ‘ ‘ из типа сообщения ‘ post‘:

add_filter('manage_post_posts_columns', function($columns) {
    unset($columns['date']);
    return $columns;
});

Изменение имен или положения столбцов по умолчанию

Предположим, у нас есть пользовательский тип записи «book», и мы хотим заменить имя столбца по умолчанию «Автор» на «Издатель». Мы просто фильтруем фильтр столбцов и присваиваем ключу ‘ author‘ другое значение:

add_filter('manage_book_posts_columns', function($columns) {
    $columns['author'] = __('Publisher', 'textdomain');
    return $columns;
});

Переупорядочить столбцы можно с помощью функций массива PHP. Имейте в виду, что результирующий массив должен быть ассоциативным массивом со столбцами «ID» в качестве ключей и их метками в качестве значений. Это простой пример извлечения authorстолбца ‘ ‘ и размещения его в самом конце, таким образом переупорядочивая столбцы:

add_filter('manage_post_posts_columns', function($columns) {
    $taken_out = $columns['author'];
    unset($columns['author']);
    $columns['author'] = $taken_out;
    return $columns;
});

Настройка пользовательского столбца как сортируемого

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

Давайте предположим, что у нас есть настраиваемый тип записи ‘ movie‘, и с помощью следующего кода мы добавляем настраиваемый столбец, который отображает пользовательские метаданные ‘ duration‘.

add_filter('manage_movie_posts_columns', function($columns) {
    return array_merge($columns, ['duration' => __('Duration', 'textdomain')]);
});
 
add_action('manage_movie_posts_custom_column', function($column_key, $post_id) {
    if ($column_key == 'duration') {
        $duration = get_post_meta($post_id, 'duration', true);
        echo (!empty($duration))? sprintf(__('%s minutes', 'textdomain'), $duration): __('Unknown', 'textdomain');
    }
}, 10, 2);

Чтобы сообщить WordPress, что мы хотим, чтобы наш столбец можно было сортировать, нам нужно подключиться к фильтру manage_edit-{$post_type}_sortable_columns. Мы добавляем наш столбец в массив фильтруемых столбцов, а затем определяем, каким orderbyдолжно быть значение ‘ ‘. Мы устанавливаем там уникальное пользовательское значение — то же имя, что и у нашего столбца — на которое мы можем ссылаться позже в нашей ловушке запроса.

add_filter('manage_edit-movie_sortable_columns', function($columns) {
    $columns['duration'] = 'duration';
    return $columns;
});

Если вы обновите WordPress сейчас, вы должны увидеть, что наш пользовательский столбец действительно кликабельный и сортируемый, но он не сортируется правильно. Это потому, что WordPress не понимает ‘ duration‘ как значение ‘ orderby‘. Вот что мы исправим, подключившись к ‘ pre_get_posts‘:

add_action('pre_get_posts', function($query) {
    if (!is_admin()) {
        return;
    }
    $orderby = $query->get('orderby');
    if ($orderby == 'duration') {
        $query->set('meta_key', 'duration');
        $query->set('orderby', 'meta_value_num');
    }
});

Поскольку наша пользовательская метамета сообщения ‘ duration‘ всегда будет числом, мы можем определить ‘ orderby‘ как ‘ meta_value_num‘ для сравнения чисел. Настройте аргументы запроса, чтобы они соответствовали вашим настраиваемым мета-значениям сообщений.

Отключить сортировку для столбцов по умолчанию

Отключить сортировку для столбца по умолчанию довольно просто. Все, что нам нужно сделать, это подключиться к фильтру manage_edit-{$post_type}_sortable_columnsи удалить из массива столбец, по которому мы не хотим сортировать. Например, это удаляет сортировку для столбца даты для типа сообщения ‘ post‘.

add_filter('manage_edit-post_sortable_columns', function($columns) {
    unset($columns['date']);
    return $columns;
});

Источник записи: awhitepixel.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее