web-dev-qa-db-ja.com

次/前の兄弟ページのソート順

いくつかの子ページがあるページがあります。親ページでは、すべての子ページをタイトルのアルファベット順にリストしますが、ソートでは「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リンクを作成するさまざまな方法を試しましたが、どの方法でもページの並べ替え順序を希望どおりに制御できませんでした。

1
Simifilm

この場合、独自の関数を作成するのがおそらく最も簡単だと思います。以下にその方法の大まかな概要を示します。

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