web-dev-qa-db-fra.com

messages classés par titre deuxième mot

Ceci est une question commune, je n'ai pas été en mesure de trouver une réponse simple à.
Je souhaite générer une liste de titres de type publication personnalisée. im en utilisant 'orderby' => 'title' pour les afficher en ordre alphabétique. Les titres sont des noms et des noms et je veux trier par nom de famille. Je sais que je pourrais créer des méta-champs avec des noms et des prénoms séparés et l'ordre du champ de nom de famille. Mais j'aimerais vraiment voir s'il n'y a pas de bonne méthode pour explode le 'title' et passer le deuxième mot à `orderby '.

C'est le code de base:

<?php
// Get the 'Actors' post type

$args = array(
'post_type' => 'actors',
'orderby' => 'title',
'order' => 'ASC',
'nopaging' => true,
'cache_results' => false,
'update_post_meta_cache' => false
);
$loop = new WP_Query($args);

while($loop->have_posts()): $loop->the_post();
echo '<li><img src="' . get_post_meta(get_the_ID(),'_dtm_small_image', [0]) . '"><span>' . get_the_title() . '</span></li>';
endwhile;
wp_reset_query();
?> 

Iv'e a essayé de:

$gettitle = get_the_title();
$lastname = explode(" ", $gettitle);

puis passez à 'orderby' => $lastname[1],. mais ça ne marche pas.
N'existe-t-il pas un BON moyen d'utiliser le deuxième mot du titre pour trier les messages?

2
duduwish

La méthode la plus simple consiste peut-être simplement à enregistrer les titres en tant que nom de famille/prénom; ils seront alors naturellement triés. Vous pouvez ensuite inverser le titre lorsque vous le sortez dans le modèle.

Votre tentative de modification de la commande orderby var est fondamentalement erronée. La commande est créée par MySQL, qui ne comprend pas PHP, et ne peut pas être modifiée une fois la requête terminée.

Si les résultats doivent être paginés, la commande doit doit être effectuée via la requête, ce qui nécessitera la modification du SQL brut envoyé à la base de données via des filtres.

Si les résultats sont non paginated, vous pouvez trier les articles manuellement avec la variable usort de PHP:

$loop = new WP_Query( array(
    'posts_per_page' => -1,
    'post_type' => 'actors'
) );

// sort function
function wpd_last_name_sort( $a, $b ) {
    $a_last = end(explode(' ', $a->post_title));
    $b_last = end(explode(' ', $b->post_title));
    return strcasecmp( $a_last, $b_last );
}

// sort posts
usort( $loop->posts, 'wpd_last_name_sort' );

// set post object to first post in sorted list
$loop->post = $loop->posts[0];

// run the loop...

Vous voudrez probablement aussi considérer le cas où les noms sont plus que deux mots. Je créerais personnellement les titres last name, first name et laisserais MySQL faire le travail.

2
Milo