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();
?>
Réponses:
Le problème
Je pense qu'il y a une faute de frappe là-dedans:
Le nom du filtre est
posts_fields
paspost_fields
.Cela pourrait expliquer pourquoi
title2
champ est inconnu, car sa définition n'est pas ajoutée à la chaîne SQL générée.Alternative - Filtre simple
On peut le réécrire pour n'utiliser qu'un seul filtre:
où vous pouvez maintenant activer la commande personnalisée avec le
_custom
paramètre orderby:Alternative - récursive
TRIM()
Implémentons l'idée récursive de Pascal Birchler , commentée ici :
où l'on peut par exemple construire la fonction récursive comme:
Cela signifie que
générera:
Alternative - MariaDB
En général, j'aime utiliser MariaDB au lieu de MySQL . Ensuite, c'est beaucoup plus facile car MariaDB 10.0.5 prend en charge
REGEXP_REPLACE
:la source
functions.php
et l'appeler viaorderby
quand j'en ai besoin. Excellente solution - merci :-)Un moyen plus simple peut être de parcourir et de modifier le slug de permalien sur les publications qui en ont besoin (sous le titre sur l'écran de rédaction de la publication), puis de simplement l'utiliser pour commander au lieu du titre.
c'est à dire.
post_name
ne pas utiliserpost_title
pour le tri ...Cela signifierait également que votre permalien peut être différent si vous utilisez% postname% dans votre structure de permalien, ce qui pourrait être un bonus supplémentaire.
par exemple.
http://example.com/rolling-stones/
ne donne pashttp://example.com/the-rolling-stones/
EDIT : code pour mettre à jour les slugs existants, en supprimant les préfixes indésirables de la
post_name
colonne ...la source
ÉDITER
J'ai un peu amélioré le code. Tous les blocs de code sont mis à jour en conséquence. Juste une note cependant avant de passer aux mises à jour dans la RÉPONSE ORIGINALE , j'ai configuré le code pour fonctionner avec les éléments suivants
Type de publication personnalisé ->
release
Taxonomie personnalisée ->
game
Assurez-vous de régler cela en fonction de vos besoins
RÉPONSE ORIGINALE
En plus des autres réponses et de la faute de frappe signalées par @birgire, voici une autre approche.
Tout d'abord, nous définirons le titre comme un champ personnalisé masqué, mais nous supprimerons d'abord les mots comme
the
celui que nous souhaiterions exclure. Avant de faire cela, nous devons d'abord créer une fonction d'aide afin de supprimer les mots interdits des noms de termes et des titres de publicationMaintenant que nous avons couvert cela, regardons le morceau de code pour définir notre champ personnalisé. Vous devez supprimer complètement ce code dès que vous avez chargé une page une fois. Si vous avez un site énorme avec une tonne de publications, vous pouvez définir
posts_per_page
quelque chose pour100
et exécuter les scripts plusieurs fois jusqu'à ce que toutes les publications aient le champ personnalisé défini sur toutes les publicationsMaintenant que les champs personnalisés sont définis sur tous les articles et que le code ci-dessus est supprimé, nous devons nous assurer que nous définissons ce champ personnalisé sur tous les nouveaux articles ou chaque fois que nous mettons à jour le titre de l'article. Pour cela, nous utiliserons le
transition_post_status
crochet. Le code suivant peut aller dans un plugin ( que je recommande ) ou dans votrefunctions.php
DEMANDER VOS ARTICLES
Vous pouvez exécuter vos requêtes normalement sans aucun filtre personnalisé. Vous pouvez interroger et trier vos messages comme suit
la source
Les réponses de birgire fonctionnent bien lors de la commande uniquement par ce champ. J'ai apporté quelques modifications pour le faire fonctionner lors de la commande par plusieurs champs (je ne suis pas sûr que cela fonctionne correctement lorsque la commande du titre est la principale):
la source