web-dev-qa-db-fra.com

Trier le titre du post wp par ordre alphabétique et numérique?

Existe-t-il un moyen de trier une nouvelle requête de publication Wordpress en fonction du titre, mais numériquement et non alphabétiquement?

J'ai quelques titres qui ont beaucoup du même nom en ordre alphabétique, puis ont un numéro après, donc bien sûr par exemple Wordpress met title12 devant title1.

$args = array( 'orderby'=> 'title', 'order' => 'ASC', ); $loop = new WP_Query( $args );

Je sais que nous avons cette fonctionnalité pour trier les titres par ordre croissant, mais cela ne trie pas les titres comme celui-ci: - Titre 1 Titre 2

S'il vous plaît laissez-moi savoir si nous travaillons autour en utilisant la requête wp? Merci d'avance pour votre aide :)

1
Saurabh

Eh bien, techniquement, ce que WP fait est correct. Vous pouvez renommer vos titres en utilisant des 0 préfixés.

Title 001
Title 012 

Autrement

Vous pouvez utiliser le tri en utilisant la date de publication

Ou vous pouvez utiliser un méta-champ d'ordre et trier celui-ci en utilisant wp_query

2
woony

Vos titres ne sont pas des nombres. Vous ne pouvez pas trier numériquement si vous n'avez pas de chiffres. Où "T" va-t-il dans une séquence numérique?

Cependant, si vous avez un motif cohérent que vous pouvez utiliser pour séparer le titre - j'ai utilisé un caractère d'espacement et ai supposé un motif comme "Titre" + espace + "numéro" - vous pouvez faire quelque chose comme ceci:

function numeric_sort_title_field($fields) {
  remove_filter('posts_fields','numeric_sort_title_field');
  global $wpdb;
  $fields .= ', ';
  $fields .= 'REVERSE(';
    $fields .= 'LEFT(';
      $fields .= "REVERSE({$wpdb->posts}.post_title),";
      $fields .= "LOCATE(' ',REVERSE({$wpdb->posts}.post_title))";
    $fields .= ')';
  $fields .= ') + 0';
  $fields .= ' AS number';

  $fields .= ', ';
  $fields .= 'REVERSE(';
    $fields .= 'LEFT(';
      $fields .= "REVERSE({$wpdb->posts}.post_title),";
      $fields .= "LENGTH({$wpdb->posts}.post_title) - LOCATE(' ',REVERSE({$wpdb->posts}.post_title))";
    $fields .= ')';
  $fields .= ') + 0';
  $fields .= ' AS title_text';

  return $fields;
}
add_filter('posts_fields','numeric_sort_title_field');

function numeric_sort_title($orderby) {
  remove_filter('posts_orderby','numeric_sort_title');
  $orderby = ' title_text, number';
  return $orderby;
}
add_filter('posts_orderby','numeric_sort_title');

$q = new WP_Query(
  array(
    'post_type' => 'post',
    'posts_per_page' => -1
  )
);
var_dump($q->request);
if ($q->have_posts()) {
  while ($q->have_posts()) {
    $q->the_post();
    the_title();
    echo '<br>';
  }
}

Vous devriez obtenir les messages triés par la partie texte du titre, puis par la partie numérique.

0
s_ha_dum