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

Вы когда-нибудь создавали пользовательский тип публикации, а затем обнаруживали, что в списках админов отображаются только заголовки и даты ваших публикаций? Хотя WordPress добавит таксономии для вас, это самое большее, что он может сделать. Добавление соответствующей информации на первый взгляд легко; в этой статье мы посмотрим, как изменить список сообщений админа с WordPress.

Чтобы убедиться, что мы находимся на той же странице, список админ представляет собой таблицу сообщений, отображаемых в разделе админ при нажатии на “Сообщения”, “Страницы” или другой пользовательский тип публикации. Прежде чем углубиться, стоит отметить, что таблицы админ создаются с помощью WP_List_Table класса. Джереми Desvaux де Мариньи написал большую статью на родной админ таблицы, которая объясняет, как сделать это с нуля.

Дальнейшее чтение на SmashingMag:

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

Создание пользовательского типа поста

Этот процесс довольно прост и хорошо документирован в “Полное руководство по пользовательским типамсообщений”. Все, что нам нужно, это определение меток, которые мы собираемся использовать, и несколько настроек. Откройте свой functions.php файл и упавите в него следующее.

add_action( 'init', 'bs_post_types' );
function bs_post_types() {

  $labels = array(
    'name'                => __( 'Events', THEMENAME ),
    'singular_name'       => __( 'Event', THEMENAME ),
    'add_new'             => __( 'Add New', THEMENAME ),
    'add_new_item'        => __( 'Add New Event', THEMENAME ),
    'edit_item'           => __( 'Edit Event', THEMENAME ),
    'new_item'            => __( 'New Event', THEMENAME ),
    'all_items'           => __( 'All Event', THEMENAME ),
    'view_item'           => __( 'View Event', THEMENAME ),
    'search_items'        => __( 'Search Events', THEMENAME ),
    'not_found'           => __( 'No events found', THEMENAME ),
    'not_found_in_trash'  => __( 'No events found in Trash', THEMENAME ),
    'menu_name'           => __( 'Events', THEMENAME ),
  );

  $supports = array( 'title', 'editor' );

  $slug = get_theme_mod( 'event_permalink' );
  $slug = ( empty( $slug ) ) ? 'event' : $slug;

  $args = array(
    'labels'              => $labels,
    'public'              => true,
    'publicly_queryable'  => true,
    'show_ui'             => true,
    'show_in_menu'        => true,
    'query_var'           => true,
    'rewrite'             => array( 'slug' => $slug ),
    'capability_type'     => 'post',
    'has_archive'         => true,
    'hierarchical'        => false,
    'menu_position'       => null,
    'supports'            => $supports,
  );

  register_post_type( 'event', $args );

}

Быстрый совет

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

events_original

То, что мы получаем это список сообщений выше. Это лучше, чем ничего, но он не имеет на взгляд информации на всех. Место проведения мероприятия, время начала и статус билета были бы отличными дополнениями, так что давайте растрескивать!

Добавление пользовательских заголовков таблицы

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

Добавление заголовка так же просто, как изменение значения массива. Это звучит как работа для фильтра!

add_filter('manage_event_posts_columns', 'bs_event_table_head');
function bs_event_table_head( $defaults ) {
    $defaults['event_date']  = 'Event Date';
    $defaults['ticket_status']    = 'Ticket Status';
    $defaults['venue']   = 'Venue';
    $defaults['author'] = 'Added By';
    return $defaults;
}

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

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

Заполните ‘er Up!

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

add_action( 'manage_event_posts_custom_column', 'bs_event_table_content', 10, 2 );

function bs_event_table_content( $column_name, $post_id ) {
    if ($column_name == 'event_date') {
    $event_date = get_post_meta( $post_id, '_bs_meta_event_date', true );
      echo  date( _x( 'F d, Y', 'Event date format', 'textdomain' ), strtotime( $event_date ) );
    }
    if ($column_name == 'ticket_status') {
    $status = get_post_meta( $post_id, '_bs_meta_event_ticket_status', true );
    echo $status;
    }

    if ($column_name == 'venue') {
    echo get_post_meta( $post_id, '_bs_meta_event_venue', true );
    }

}

Как видно из структуры этой функции, она называется отдельно для каждого столбца. Из-за этого нам необходимо проверить, какой столбец в настоящее время отображается, а затем выплюнуть соответствующие данные.

Данные, необходимые для этого, хранятся в postmeta таблице. Вот как это сделать:

  • Дата события хранится с помощью _bs_meta_event_date ключа.
  • Статус билета использует _bs_meta_event_ticket_status ключ.
  • Место хранения хранится с помощью _bs_meta_event_venue мета-ключа.

Поскольку все эти postmeta значения, нам просто нужно использовать get_post_meta() функцию для их извлечения. За исключением даты, мы можем повторить эти значения сразу.

Это подводит нас к важному моменту. Вы не можете только показывать отдельные фрагменты данных или показывать ссылки. Все, что вы выход будет показано. При достаточном времени можно прикрепить календарь к датам, которые будут показаны на нависке. Вы можете создать меню flyout, которые открываются на кнопку, и так далее.

events_data

Как вы можете видеть, это гораздо лучше. Дата мероприятия, статус билета, место и автор можно увидеть, что делает эту таблицу на самом деле информативным, а не просто способ добраться до отсвагивания страниц. Тем не менее, мы можем сделать больше.

Заказ колонн

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

add_filter( 'manage_edit-event_sortable_columns', 'bs_event_table_sorting' );
function bs_event_table_sorting( $columns ) {
  $columns['event_date'] = 'event_date';
  $columns['ticket_status'] = 'ticket_status';
  $columns['venue'] = 'venue';
  return $columns;
}

add_filter( 'request', 'bs_event_date_column_orderby' );
function bs_event_date_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'event_date' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => '_bs_meta_event_date',
            'orderby' => 'meta_value'
        ) );
    }

    return $vars;
}

add_filter( 'request', 'bs_ticket_status_column_orderby' );
function bs_ticket_status_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'ticket_status' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => '_bs_meta_event_ticket_status',
            'orderby' => 'meta_value'
        ) );
    }

    return $vars;
}

add_filter( 'request', 'bs_venue_column_orderby' );
function bs_venue_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'venue' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => '_bs_meta_event_venue',
            'orderby' => 'meta_value'
        ) );
    }

    return $vars;
}

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

Когда мы говорим: “заказать по месту проведения”, WordPress не знает, что это значит. Результаты заказываются до их отображения, а не после факта. Таким образом, WordPress необходимо знать, что для того, чтобы тянуть должности, прежде чем он на самом деле получает их. Таким образом, мы говорим WordPress, какие meta_key фильтровать и как относиться к значениям meta_value (для строк, meta_value_num для рядов).

Как и в отображении данных, вы можете сходить с ума здесь. Вы можете использовать все аргументы, которые WP_Query принимают для выполнения фильтрации таксономии, мета-поле запросов и так далее.

Добавив приведенный выше код, мы можем нажать на заказ в зависимости от даты, статуса и места проведения. Мы почти там. Еще одна вещь будет помочь много, особенно при работе с сотнями событий.

Фильтрация данных

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

add_action( 'restrict_manage_posts', 'bs_event_table_filtering' );
function bs_event_table_filtering() {
  global $wpdb;
  if ( $screen->post_type == 'event' ) {

    $dates = $wpdb->get_results( "SELECT EXTRACT(YEAR FROM meta_value) as year,  EXTRACT( MONTH FROM meta_value ) as month FROM $wpdb->postmeta WHERE meta_key = '_bs_meta_event_date' AND post_id IN ( SELECT ID FROM $wpdb->posts WHERE post_type = 'event' AND post_status != 'trash' ) GROUP BY year, month " ) ;

    echo ’;
      echo ’ . __( 'Show all event dates', 'textdomain' ) . ’;
    foreach( $dates as $date ) {
      $month = ( strlen( $date->month ) == 1 ) ? 0 . $date->month : $date->month;
      $value = $date->year . '-' . $month . '-' . '01 00:00:00';
      $name = date( 'F Y', strtotime( $value ) );

      $selected = ( !empty( $_GET['event_date'] ) AND $_GET['event_date'] == $value ) ? 'selected="select"' : ’;
      echo ’ . $name . ’;
    }
    echo ’;

    $ticket_statuses = get_ticket_statuses();
    echo ’;
      echo ’ . __( 'Show all ticket statuses', 'textdomain' ) . ’;
    foreach( $ticket_statuses as $value => $name ) {
      $selected = ( !empty( $_GET['ticket_status'] ) AND $_GET['ticket_status'] == $value ) ? 'selected="selected"' : ’;
      echo ’ . $name . ’;
    }
    echo ’;

  }
}

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

Как только мы уверены, что находимся на странице событий, мы добавляем два элемента управления: селектор для дат событий и селектор для статусов билетов.

У нас есть одна пользовательская функция там, get_ticket_statuses() который используется для получения списка статусов билетов. Все они определяются пользователем, поэтому описание того, как это работает, было бы излишним. Достаточно сказать, что он содержит массив с парами ключей, которые нам нужны для селектора.

events_final

Как только это будет сделано, таблица достигнет своей окончательной формы. Теперь у нас есть наши фильтры вдоль верхней, но они не работают еще. Давайте исправим это, не так ли?

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

add_filter( 'parse_query','bs_event_table_filter' );
function bs_event_table_filter( $query ) {
  if( is_admin() AND $query->query['post_type'] == 'event' ) {
    $qv = &$query->query_vars;
    $qv['meta_query'] = array();

    if( !empty( $_GET['event_date'] ) ) {
      $start_time = strtotime( $_GET['event_date'] );
      $end_time = mktime( 0, 0, 0, date( 'n', $start_time ) + 1, date( 'j', $start_time ), date( 'Y', $start_time ) );
      $end_date = date( 'Y-m-d H:i:s', $end_time );
      $qv['meta_query'][] = array(
        'field' => '_bs_meta_event_date',
        'value' => array( $_GET['event_date'], $end_date ),
        'compare' => 'BETWEEN',
        'type' => 'DATETIME'
      );

    }

    if( !empty( $_GET['ticket_status'] ) ) {
      $qv['meta_query'][] = array(
        'field' => '_bs_meta_event_ticket_status',
        'value' => $_GET['ticket_status'],
        'compare' => '=',
        'type' => 'CHAR'
      );
    }

    if( !empty( $_GET['orderby'] ) AND $_GET['orderby'] == 'event_date' ) {
      $qv['orderby'] = 'meta_value';
      $qv['meta_key'] = '_bs_meta_event_date';
      $qv['order'] = strtoupper( $_GET['order'] );
    }

  }
}

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

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

Обзор

Добавление пользовательских данных в таблицу — это отличный способ привлечь внимание пользователей к информации. Разработчики плагина могут подключить свою функциональность к публикациям, не касаясь каких-либо других функций, а авторы темы могут добавлять расширенную информацию о пользовательских типах постов и других вещах в соответствующие места.

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

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

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

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

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

%d такие блоггеры, как: