いくつかの子ページがあるページがあります。親ページでは、すべての子ページをタイトルのアルファベット順にリストしますが、ソートでは「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();
この部分はスムーズに機能します。私の問題は、それぞれの兄弟ページにNext/Prevリンクを持ちたいということです。ここで、ページの順序は親ページの順序と同じでなければなりません。親ページに特定の順序でページを表示し、子ページにアクセスした後に順序を完全に変更する場合、IMOは実際には意味がありません。
Next/Prevリンクを作成するさまざまな方法を試しましたが、どの方法でもページの並べ替え順序を希望どおりに制御できませんでした。
この場合、独自の関数を作成するのがおそらく最も簡単だと思います。以下にその方法の大まかな概要を示します。
// 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 ) );