下一页/上一页的排序顺序

时间:2018-02-12 作者:Simifilm

我有一个有几个孩子的页面。在父页面上,我希望所有子页面按标题的字母顺序列出,但我希望排序忽略“the”或“A”之类的文章。我用从中获得的代码实现了这一点here.

这是我的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;
}
下面是我的Wordpress查询:

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();
这部分工作顺利。我的问题是,我希望在相应的兄弟页面上有下一个/上一个链接,而这里页面的顺序应该与父页面上的顺序相同。在我看来,如果我在父页面上以特定的顺序呈现页面,然后在访问子页面后完全更改顺序,那就没有什么意义了。

我尝试了各种方法来创建下一个/上一个链接,但没有一种方法允许我以我想要的方式控制页面的排序顺序。

1 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

我认为在这种情况下,创建自己的一两个函数可能是最简单的。下面我给你一个大致的大纲,告诉你怎么做。

// 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 ) );

结束

相关推荐

更改回调wp_Query的POSTS_ORDERBY?

我发现this answer 这有助于在我的搜索查询中按帖子类型对查询结果排序。但问题是当我去https://example.com/?s=query%20string 如果我使用原生php搜索进行搜索。这太棒了。但我也可以通过ajax进行搜索——当我键入时,ajax将调用在自定义rest端点上注册的回调函数。因此,我想知道是否有任何方法可以识别该自定义查询,以便重用该过滤器?在条件中:if ( ! is_admin() && is_search() && is_