J'ai créé un type de publication personnalisé pour afficher les événements futurs, avec la date de l'événement stockée dans un champ personnalisé (format AAAA/MM/JJ). J'aimerais que l'écran d'administration de ce type d'article personnalisé soit automatiquement trié par le champ personnalisé de la date de l'événement.
Après avoir essayé l'excellent tutorial de MikeSchnickel pour créer une colonne 'trier par', je pense avoir compris que je devais utiliser quelque chose de similaire au filtre parse_query qu'il utilise. Mais je n'arrive pas à l'adapter à mes besoins,
Je suis assez novice dans la personnalisation de Wordpress, alors quelques conseils simples seraient les bienvenus!
Voici mon code pour enregistrer le type personnalisé post (gs_events), ajouter une méta-boîte pour le champ personnalisé (event_date) et configurer des colonnes personnalisées pour l'écran d'administration ....
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;
}
}
Et je pense que je dois ajouter quelques modifications de ce code à partir du tutoriel susmentionné de Mike Schnickels, mais je ne sais pas comment le mettre en œuvre dans ce cas ...
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'];
}
}
Enregistrez plutôt la date du champ méta de l'événement en tant qu'horodatage unix, au lieu d'une chaîne, sinon vous rendrez la vie trop difficile pour vous. Cela facilite les comparaisons de dates.
Voici un exemple de conversion de votre format AAAA/MM/JJ en un horodatage 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.
}
Pour reconvertir pour l'édition et l'affichage par l'utilisateur, il suffit de:
$displayValue = date('Y/m/d', $timestamp);
Je vous recommande également de nommer votre champ personnalisé avec un nom plus spécifique, tel que gs_event_date?
Après cela, créez votre filtre:
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.
}
}
}
}
Ajoutez votre filtre ...
add_filter('pre_get_posts' , 'gs_events_pre_get_posts');