it-swarm.com.de

Automatisches Sortieren des Administrationsbereichs für benutzerdefinierte Posts nach benutzerdefinierten Feldern

Ich habe einen benutzerdefinierten Beitragstyp erstellt, um zukünftige Ereignisse anzuzeigen, wobei das Datum des Ereignisses in einem benutzerdefinierten Feld gespeichert ist (Format JJJJ/MM/TT). Ich möchte, dass der Administratorbildschirm für diesen benutzerdefinierten Beitragstyp automatisch nach dem benutzerdefinierten Feld für das Ereignisdatum sortiert wird.

Nachdem ich MikeSchnickels hervorragendes Tutorial zum Erstellen einer 'sort by'-Spalte ausprobiert habe, denke ich, dass ich etwas Ähnliches wie den von ihm verwendeten parse_query-Filter verwenden muss. Aber ich kann es nicht an meine Bedürfnisse anpassen,

Ich bin ziemlich neu in der Anpassung von WordPress wie folgt, also wäre eine einfache Anleitung sehr willkommen!

Hier ist mein Code, um den benutzerdefinierten Beitragstyp (gs_events) zu registrieren, ein Meta-Feld für das benutzerdefinierte Feld (event_date) hinzuzufügen und benutzerdefinierte Spalten für den Admin-Bildschirm einzurichten.

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

Und ich denke, ich muss eine Modifikation dieses Codes aus Mike Schnickels 'oben genanntem Tutorial hinzufügen, aber ich bin nicht sicher, wie ich es in diesem Fall implementieren soll ...

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

Speichern Sie das/die Ereignis-Metafelddatum (e) lieber als Unix-Zeitstempel anstelle einer Zeichenfolge, oder Sie machen sich das Leben zu schwer. Es macht nur Datumsvergleiche so viel einfacher.

Hier ist ein Beispiel, wie Sie Ihr JJJJ/MM/TT-Format in einen Unix-Zeitstempel konvertieren:

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

Das Zurückkonvertieren zum Bearbeiten und Anzeigen durch den Benutzer ist so einfach wie:

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

Ich würde auch empfehlen, dass Sie Ihrem benutzerdefinierten Feld einen spezifischeren Namen geben, z. B. gs_event_date?

Nachdem Sie das getan haben, erstellen Sie Ihren Filter:

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

Füge deinen Filter hinzu ...

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