Classer des articles par un champ personalisé
Les champs personalisé de Wordpress son facil à ajouter mais un peu plus complexe de les utilisés pour créé des liste d'article ou pour ordonées les articles. Dans mon cas, j'ai rajouter un champ personalisé pour ajouter la date à des événements tout en conservant la date de publication de l'article.
Solution simple :
Dans mon exemple mon champ personalisé est : date-yyyy-dd-jj à remplacer par le votre
$query = new WP_Query( array ( 'orderby' => 'date-yyyy-mm-jj', 'order' => 'ASC', 'meta_key' => 'date-yyyy-mm-jj' );
Solution complexe :
Le principe est simple, au lieu d'utilisé la requete normal de wordpress on utilise une requete modifier dans laquel on fait la jointure de la table des champ personalisé pour pouvoir trier les données celon les donné personalisé.
Étape 1
Trouver la requete SQL que Wordpress utilise pour afficher la page que vous voulez modifier (en prenant en compte vos champ personalisés). Avec le code php:
echo $GLOBALS['wp_query']->request;
Étape 2
Créé un nouveau fichier de template et modifier la page pour utilisé directement la requete SQL au lieu de l'utilisation standard de Wordpress avec la requete calculer en background. Pour ma part j'ai modifier l'ordre d'une catégorie alors j'ai créé un nouveau fichier template category-nomdemacat.php, vous pouver aussi créé un template que vous pouvez choisir pour une page.
Étape 3
Ajouter les jointure dans la requete pour pouvoir utilisé les champ personalisé. Dans la requête qui est actuellement utilisé dans votre page ajouter la jointure avec la table wp_postmeta et avec le orderby modifier le tour est joué. Il suffit d'utilisé cette requete SQL modifiwer pour afficher la liste des articles. L'options $postids=$wpdb->get_col( $wpdb->prepare(SQL custum)) de Wordpress permet d'exécuter une requête SQL.
Voici un exemple complet de template à utilisé pour afficher une catégori avec trie sur un champs personalisé
/*
* Afficher une page de catégorie de WP avec trie avec champ personalisé
* Avec affichage de la date des compétition et du nombre de jour restant
*
* @author PHPascal.com
* @since 15 fev 2013
* @link http://www.phpascal.com/programmation-web/Wordpress/classer-champ-personalises-wp.html
*/
get_header();
$postids=$wpdb->get_col( $wpdb->prepare("
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (7,14,25,27,28) )
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY 'wp_postmeta.date-yyyy-mm-jj' ASC, wp_posts.ID ASC ") );
if ( $postids )
{
foreach ( $postids as $id )
{
$post = get_post( intval( $id ) );
setup_postdata( $post );
print "<article>\n";
print "\t<h3><a href='".the_permalink()."'>".the_title()."</a></h3>\n";
// ajouter date de l'evenement et le nombre de jour
$date_aff = get_post_meta($post->ID, 'date-afficher', true);
$date_yy = get_post_meta($post->ID, 'date-yyyy-mm-jj', true);
$date_test = date('Y-m-d');
$nb_jour_aff = '';
if ($date_yy != '')
{
$date1 = strtotime($date_test);
$date2 = strtotime($date_yy);
$datediff = $date2 - $date1;
$nb_jour = floor($datediff/(60*60*24));
$nb_jour_aff = "(dans $nb_jour jours)";
if ($nb_jour == 0) $nb_jour_aff = "AUJOURD'HUI!";
if ($nb_jour < 0) $nb_jour_aff = '';
}
if ($date_aff != '') print "<h2>$date_aff $nb_jour_aff</h2>\n";
// fin afficher date et nb jour
the_excerpt();
print "</article>";
}//end loop
}
else
{
print "Aucun acticle pour le moment";
}
get_footer();
Dans mon exemple j'utilise deux champ personalisé pour la date des compétitions une date au format yyyy-mm-dd pour le classement et une date pour l'affichage