J'essaie actuellement de produire une liste de titres de musique et j'aimerais que le tri ignore (mais affiche toujours) l'article initial du titre.
Par exemple, si j'avais une liste de groupes, elle s'affichera alphabétiquement dans WordPress comme ceci:
- Sabbat noir
- Led Zeppelin
- Pink Floyd
- Les Beatles
- The Kinks
- Les pierres qui roulent
- Thin Lizzy
Au lieu de cela, je voudrais l'afficher par ordre alphabétique tout en ignorant l'article initial «The», comme ceci:
- Les Beatles
- Sabbat noir
- The Kinks
- Led Zeppelin
- Pink Floyd
- Les pierres qui roulent
- Thin Lizzy
Je suis tombé sur une solution dans un article de blog de l'année dernière , qui suggère le code suivant dans functions.php
:
function wpcf_create_temp_column($fields) {
global $wpdb;
$matches = 'The';
$has_the = " CASE
WHEN $wpdb->posts.post_title regexp( '^($matches)[[:space:]]' )
THEN trim(substr($wpdb->posts.post_title from 4))
ELSE $wpdb->posts.post_title
END AS title2";
if ($has_the) {
$fields .= ( preg_match( '/^(\s+)?,/', $has_the ) ) ? $has_the : ", $has_the";
}
return $fields;
}
function wpcf_sort_by_temp_column ($orderby) {
$custom_orderby = " UPPER(title2) ASC";
if ($custom_orderby) {
$orderby = $custom_orderby;
}
return $orderby;
}
puis encapsuler la requête avec add_filter
avant et remove_filter
après.
J'ai essayé cela, mais je reçois toujours l'erreur suivante sur mon site:
Erreur de base de données WordPress: [colonne inconnue 'title2' dans la 'clause de commande']
SELECT wp_posts. * FROM wp_posts WHERE 1 = 1 AND wp_posts.post_type = 'release' AND (wp_posts.post_status = 'publish' OU wp_posts.post_status = 'private') ORDER BY UPPER (title2) ASC
Je ne vais pas mentir, je suis assez nouveau dans la partie php de WordPress, donc je ne sais pas pourquoi je reçois cette erreur. Je peux voir que cela a quelque chose à voir avec la colonne 'title2', mais je croyais que la première fonction devrait s'en occuper. De plus, s'il existe un moyen plus intelligent de le faire, je suis tout à fait à l'écoute. J'ai fait des recherches sur ce site et fait des recherches sur ce site, mais je n'ai pas vraiment trouvé beaucoup de solutions.
Mon code utilisant les filtres ressemble à ceci si cela peut aider:
<?php
$args_post = array('post_type' => 'release', 'orderby' => 'title', 'order' => 'ASC', 'posts_per_page' => -1, );
add_filter('post_fields', 'wpcf_create_temp_column'); /* remove initial 'The' from post titles */
add_filter('posts_orderby', 'wpcf_sort_by_temp_column');
$loop = new WP_Query($args_post);
remove_filter('post_fields', 'wpcf_create_temp_column');
remove_filter('posts_orderby', 'wpcf_sort_by_temp_column');
while ($loop->have_posts() ) : $loop->the_post();
?>