it-swarm.dev

Automatické řazení vlastního typu příspěvku admin oblasti podle vlastního pole

Vytvořil jsem vlastní typ příspěvku pro zobrazení budoucích událostí s datem události uloženým ve vlastním poli (formát RRRR/MM/DD). Chci, aby byla obrazovka admin pro tento typ vlastního příspěvku automaticky tříděna podle vlastního pole data události.

Po vyzkoušení MikeSchnickelova vynikajícího tutoriálu na vytvoření sloupce „třídit podle“ si myslím, že jsem pracoval na tom, že musím použít něco podobného filtru parse_query, který používá. Ale nedokážu to přizpůsobit svým potřebám,

Jsem docela nový na přizpůsobení wordpress, jako je tento, takže některé jednoduché pokyny by bylo hodně ocenil!

Zde je můj kód pro registraci vlastního typu příspěvku (gs_events), přidat meta box pro vlastní pole (event_date) a nastavit vlastní sloupce pro obrazovku admin.

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

A já si myslím, že musím přidat nějakou úpravu tohoto kódu z výše uvedeného tutoriálu Mika Schnickelsa, ale nejsem si jistý, jak ho v tomto případě implementovat ...

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

Namísto řetězec uložte datum (data) události meta pole jako unixové časové razítko, jinak budete dělat život příliš obtížným pro sebe. To jen dělá datum srovnání mnohem jednodušší.

Zde je příklad, jak převést formát YYYY/MM/DD na časovou značku 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.
}

Chcete-li převést data zpět pro úpravy a zobrazení uživatelů, je to tak jednoduché jako:

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

Doporučuji také, abyste své vlastní pole označili za něco konkrétnějšího, například gs_event_date?

Poté, co jste to udělali, vytvořte svůj filtr:

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

Přidat filtr ...

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