george
  • 0
Новичок

Автоматическая сортировка админ-панели пользовательского типа записи по настраиваемому полю

  • 0

Я создал настраиваемый тип сообщения для отображения будущих событий, при этом дата события хранится в произвольном поле (в формате ГГГГ/ММ/ДД). Я бы хотел, чтобы экран администратора для этого настраиваемого типа сообщений автоматически сортировался по настраиваемому полю даты события.

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

Я новичок в такой настройке WordPress, поэтому некоторые простые рекомендации будут очень признательны!

Вот мой код для регистрации сообщения пользовательского типа (gs_events), добавления мета-поля для пользовательского поля (event_date) и настройки пользовательских столбцов для экрана администратора….

add_action('init', 'my_custom_init');

function my_custom_init() {
  $labels = array(
    'name' => _x('Events', 'post type general name'),
    'singular_name' => _x('Event', 'post type singular name'),
    'add_new' => _x('Add New', 'event'),
    'add_new_item' => __('Add New Event'),
    'edit_item' => __('Edit Event'),
    'new_item' => __('New Event'),
    'view_item' => __('View Event'),
    'search_items' => __('Search Events'),
    'not_found' =>  __('No events found'),
    'not_found_in_trash' => __('No events found in Trash'), 
    'parent_item_colon' => ''
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'query_var' => true,
    'rewrite' => array('slug' => 'events'),
    'capability_type' => 'post',
    'hierarchical' => false,
    'menu_position' => 5,
    'supports' => array('title','editor','thumbnail','comments')
  ); 
  register_post_type('gs_events',$args);
}

register_taxonomy("Location", array("gs_events"), array("hierarchical" => true, "label" => "Cities", "singular_label" => "City", "rewrite" => true));

add_action("admin_init", "admin_init");

function admin_init(){
  add_meta_box("event_date-meta", "Event Date", "event_date", "gs_events", "side", "high");
}

function event_date(){
  global $post;
  $custom = get_post_custom($post->ID);
  $event_date = $custom["event_date"][0];
  ?>
  <label>Date:</label>
  <input name="event_date" value="<?php echo $event_date; ?>" />
  <?php
}

add_action('save_post', 'save_details');

function save_details(){
  global $post;
  update_post_meta($post->ID, "event_date", $_POST["event_date"]);
}

add_action("manage_posts_custom_column",  "events_custom_columns");
add_filter("manage_edit-gs_events_columns", "events_edit_columns");

function events_edit_columns($columns){
  $columns = array(
    "cb" => "<input type="checkbox" />",
    "title" => "Venue",
    "location" => "Location",
    "event_date" => "Date",
  );

  return $columns;
}
function events_custom_columns($column){
  global $post;

  switch ($column) {
    case "event_date":
      $custom = get_post_custom();
      echo $custom["event_date"][0];
      break;
    case "location":
      echo get_the_term_list($post->ID, 'Location', '', ', ','');
      break;
  }
}

И я считаю, что мне нужно добавить некоторую модификацию этого кода из вышеупомянутого учебника Майка Шникелса, но я не уверен, как это реализовать в этом случае…

add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
    global $pagenow;
    if (is_admin() && $pagenow=='edit.php' &&
            isset($_GET['post_type']) && isset($_GET['post_type'])=='movie' && 
            isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
        $query->query_vars['orderby'] = 'meta_value';
        $query->query_vars['meta_key'] = $_GET['sortby'];
    }
}
Share
  1. Было бы полезно, если бы мы точно знали, что вы уже сделали… можете ли вы добавить несколько фрагментов кода и указать, где именно у вас возникли проблемы?

    • 0
    • @EAMann — я добавил код сейчас, любая помощь очень ценится!

      • 0
    • Спасибо, Вернер, очень полезно… Сейчас я изо всех сил пытаюсь найти способ сохранить дату в виде временной метки UNIX, но при этом сохранить ее разборчивой на экранах администратора. Есть идеи?

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

      • 0
  2. Лучше сохраните дату (даты) метаполя события как временную метку unix, а не строку, иначе вы слишком усложните себе жизнь. Это просто делает сравнение дат намного проще.

    Вот пример того, как преобразовать формат ГГГГ/ММ/ДД в отметку времени unix:

    $date = '2010/09/22';
    $dateParts = explode('/', trim($date));
    if (count($dateParts) == 3) {
        $timestamp = mktime(0, 0, 0, $dateParts[1], $dateParts[2], $dateParts[0]);
    } else {
        $timestamp = 0; 
        // The input value is dodgy, therefore the timestamp is set to 0, which is 
        // effectively 1970-01-01T00:00:00Z.
    }
    

    Чтобы снова преобразовать для редактирования и отображения пользователем, это так же просто, как:

    $displayValue = date('Y/m/d', $timestamp);
    

    Я бы также порекомендовал вам дать вашему пользовательскому полю более конкретное имя, например gs_event_date?

    После того, как вы это сделали, создайте свой фильтр:

    function gs_events_pre_get_posts($query) {
    
        // Note: Use the $pagenow global for finer grained checking, 
        // if you want to. There are many examples out there.
    
        // Your question pertains to admin use only...
    
        if (is_admin()) {
    
            // Present the posts in your meta_key field's order in admin
    
            if (isset($query->query_vars['post_type'])) {
                if ($query->query_vars['post_type'] == 'gs_events') {
    
                    $query->set('meta_key', 'gs_event_date');
                    $query->set('orderby', 'meta_value');
                    $query->set('order', 'ASC');
    
                    // ...and if you only want your future events to be 
                    // displayed in admin, you can uncomment the following:
    
                    // $query->set('meta_compare', '>=');
                    // $query->set('meta_value', time());
    
                    // Note: The use of time() is quick-and-dirty here, 
                    // in reality you'll need to adjust the timezone, 
                    // check server-time vs local time, etc.
                }
            }
        }
    }
    

    Добавьте фильтр…

    add_filter('pre_get_posts' , 'gs_events_pre_get_posts');
    
    • 0

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

You must login to add an answer.