How to sort posts automatically by a number/year included in title

Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPrint this page

Manual sorting is a fun process, order adjustments are easy through the Advanced Post Types Order plugin drag & drop interface. Automatisation is possible through Automatic Order functionality. This provides a powerful set-up for creating algorithmic based sorting without a human intervention. For large list, this might be a good option to save good time spent on manual sorting adjustments.

For some sites, the post title ( or any other post data like content, excerpt etc ) might contain important information on which a sort is required to apply. For example a year number can be included in the title e.g.:
– Canada 1978 edition
– Spain 2000 issues
– Early Belgium 2003 fabric
– Bohemia and Moravia 1944 history

Sorting ascending by the year in titles can be done manually, however automatisation is easy achievable through Custom Function Callback and a bit of code.

 

In this particular example the callback function name is called “custom_sorting_function_sort_by_number_in_title”. The function should be included within theme functions.php or a custom plugin:

function custom_sorting_function_sort_by_number_in_title( $posts_list, $sort_view_id, $orderBy, $query)
        {
            $list_map   =   array();
            foreach($posts_list  as  $object_id)
                {
                    $object =   get_post($object_id);
                    
		    //extract the title using a regex	
                    preg_match('/\d{4}/', $object->post_title, $match );
                    
                    if ( $match  != FALSE )
                        $list_map[$object_id]   =   $match[0];    
                        else
                        $list_map[$object_id]   =   '';
                }
                 
            //sort the dates ascending
            arsort($list_map, SORT_NUMERIC);
             
            $post_list  =   array_keys($list_map);
                 
            return $post_list;  
        }