Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sort wordpress posts by title, ignore articles like “the”, “a”, “an”

I'm sorting my posts alphabetically by Title, like so:

   <?php
      {
       $posts = get_posts($query_string . 
        '&orderby=title&order=asc&posts_per_page=-1');
      } 
      get_template_part( 'loop', 'category' );
    ?>

I'd like to exclude articles such as "the", "a", and "an" from the sort.

What would be the best way to accomplish this?

Thanks!

like image 502
Ben L Avatar asked Nov 14 '22 12:11

Ben L


1 Answers

I don't know any simple way to do that but you can do this,

For achieving this you need to add a custom meta field to the post. Name it mytitle (say).

For the new posts you add, it is simple, you have to add your modified title(removing a, an, the from the title) in the mytitle custom field in the add posts page.

For old posts it is a bit tricky, you have to write a php code to retrieve the titles of the post remove 'a','an','the' from them using php preg_replace and add it to the postmeta table of your wordpress database using something like this:

<?php //inside loop   
$query=INSERT INTO xyz_postmeta (post_id, meta_key, meta_value) VALUES ($postid, 'mytitle' $title);
$wpdb->query('$query'); ?> 

where $postid is the post id inside the loop and $title is your modified title.

Now you have updated all the previous posts with custom mytitle field.

Now to display, you have to use a custom loop (not the loop included in the theme).

Here is how you can make a basic custom loop to display posts sorted in order of mytitle.

$querystr = "
   SELECT wposts.*
   FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
   WHERE wposts.ID = wpostmeta.post_id
   AND wpostmeta.meta_key = 'mytitle'
   AND wposts.post_type = 'post'
   AND wposts.post_status = 'publish'
   ORDER BY wpostmeta.meta_value ASC
   ";

Now you can execute the query by any means you want. Wordpres provides various methods to do so. Here's a link

For example you can do something like this

$pageposts = $wpdb->get_results($querystr, OBJECT);
foreach ( $pageposts as $pagepost ) 
{
    echo $pagepost->post_title;
    //do other stuff to display content, meta etc..
}
like image 88
PRYM Avatar answered Mar 07 '23 13:03

PRYM