1

I have a page with a couple of children pages. On the parent page I want all children page listed alphabetically by title, but I want the sorting to ignore articles like "The" or "A". I achieved this with code I got from here.

Here's my 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;
}

And here's my Wordpress query:

add_filter('posts_fields', 'wpcf_create_temp_column'); // Add the temporary column filter
add_filter('posts_orderby', 'wpcf_sort_by_temp_column'); // Add the custom order filter

$query = new WP_Query(array('post_type' => 'post')); // Your custom query

remove_filter('posts_fields','wpcf_create_temp_column'); // Remove the temporary column filter
remove_filter('posts_orderby', 'wpcf_sort_by_temp_column'); // Remove the temporary order filter 

if (have_posts()) : while ($query->have_posts()) : $query->the_post(); // The query output

  the_title(); 
  echo '<br/>';

endwhile; endif; wp_reset_postdata();

This part works smoothly. My problem is that I want to have Next/Prev links on the respective sibling pages, and here the order of the pages should be identical to the one on the parent page. It doesn't really make sense IMO if I present the pages in a certain order on the parent page and then completely change the ordering once you access a child page.

I tried various ways to create Next/Prev links, but none of them allowed me to control the sort ordering of the pages the way I want.

4
  • Hi. Are you talking about having paginated child pages lists and when on page 2, 3 the order is not consistent? Or do you have a list of all child pages on a parent page and then when you display a child page you are also showing its child pages?
    – Vlad Olaru
    Feb 14, 2018 at 8:33
  • You can check it out here: As you see, on the parent page, all child pages are listed alphabetically, but the article is ignored (as it should be). But once you are on a child page and navigate with the "previous" and "next" buttons, a different order is used. What I want is to use the same sorting order – with the article ignored – when I navigate through the various siblings.
    – Simifilm
    Feb 14, 2018 at 10:19
  • 1
    Ok. Now it's easier to understand what you are after. Will help you shortly. Can you share the code you are using for generating the next and previous links?
    – Vlad Olaru
    Feb 15, 2018 at 9:53
  • There is a interesting thread concerning the article issue on WordPress Development: »Ignoring initial articles (like 'a', 'an' or 'the') when sorting queries?«. It started from the same source you're using, but it is overall more detailed. Feb 18, 2018 at 19:47

1 Answer 1

0
+100

I think in this case it is probably easiest to create your own function or two. I'm giving you a rough outline on how to do it below.

// use the same filter to get the same results
add_filter( 'posts_fields', 'wpcf_create_temp_column' );
add_filter( 'posts_orderby', 'wpcf_sort_by_temp_column' );
// perform query
$q = new WP_Query( [ 
  'post_type' => 'pages', 
  'fields' => 'ids', 
  'posts_per_page' => -1 
] );
remove_filter( 'posts_fields','wpcf_create_temp_column' );
remove_filter( 'posts_orderby', 'wpcf_sort_by_temp_column' );

// array of ids
$a = $q->posts;

// index of current post
$i = array_search( get_the_ID(), $a );

// id of previous post
$pp_id = $a[ $i - 1 ];
// with the id get the permalink or whatever you need
$pp_pl = get_the_permalink( $pp_id );

// id of next post
$np_id = $a[ $i + 1 ];
// with the id get the title or whatever you need
$np_ti = esc_html( get_the_title( $np_id ) );
2
  • Thank you. It took some tinkering, but it now works as I wanted. There's a quite important typo BTW, it must say 'posts_per_page'.
    – Simifilm
    Feb 18, 2018 at 21:24
  • You are welcome. Oh you're right, next time you can just edit, I get notified and approve it. Feb 18, 2018 at 22:47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.