it-swarm-pt.tech

Classificando automaticamente a área de administração do tipo de postagem personalizada por um campo personalizado

Eu criei um tipo de postagem personalizada para exibir eventos futuros, com a data do evento armazenada em um campo personalizado (formato AAAA/MM/DD). Gostaria que a tela de administrador desse tipo de postagem personalizada fosse classificada automaticamente pelo campo personalizado da data do evento.

Tendo experimentado o excelente tutorial de MikeSchnickel ao criar uma coluna 'classificar por', acho que descobri que preciso usar algo semelhante ao filtro parse_query que ele usa. Mas não consigo adaptá-lo às minhas necessidades

Eu sou muito novo para personalizar wordpress como este, então alguma orientação simples seria muito apreciada!

Aqui está o meu código para registrar o tipo de postagem personalizada (gs_events), adicionar meta box para o campo personalizado (event_date) e configurar colunas personalizadas para a tela de administração ....

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;
  }
}

E eu acho que preciso adicionar algumas modificações deste código do tutorial acima mencionado de Mike Schnickels, mas não tenho certeza de como implementá-lo neste caso ...

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'];
    }
}
5
George

Em vez disso, salve a (s) data (s) do campo meta do evento como um registro de data e hora unix, em vez de uma cadeia, ou você tornará a vida muito difícil para você. Isso só torna as comparações de datas muito mais fáceis.

Aqui está um exemplo de como converter seu formato YYYY/MM/DD em timestamp 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.
}

Para converter novamente para edição e exibição do usuário, é tão simples quanto:

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

Também recomendo que você nomeie seu campo personalizado como algo mais específico, como gs_event_date?

Depois de ter feito isso, crie seu filtro:

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.
            }
        }
    }
}

Adicione o seu filtro ...

add_filter('pre_get_posts' , 'gs_events_pre_get_posts');
5
Werner