我有一个有几个孩子的页面。在父页面上,我希望所有子页面按标题的字母顺序列出,但我希望排序忽略“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();
这部分工作顺利。我的问题是,我希望在相应的兄弟页面上有下一个/上一个链接,而这里页面的顺序应该与父页面上的顺序相同。在我看来,如果我在父页面上以特定的顺序呈现页面,然后在访问子页面后完全更改顺序,那就没有什么意义了。
我尝试了各种方法来创建下一个/上一个链接,但没有一种方法允许我以我想要的方式控制页面的排序顺序。
最合适的回答,由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 ) );