私は現在、音楽タイトルのリストを出力しようとしていますが、タイトルの最初の記事をソートで無視するようにしたい(しかし、まだ表示したい)のです。
たとえば、バンドのリストがある場合、WordPressでは次のようにアルファベット順に表示されます。
- ブラックサバス
- レッド・ツェッペリン
- ピンク・フロイド
- ビートルズ
- キンクス
- ローリングストーン
- 薄いリジー
代わりに、次のように最初の記事「The」を無視してアルファベット順に表示したいと思います。
- ビートルズ
- ブラックサバス
- キンクス
- レッド・ツェッペリン
- ピンク・フロイド
- ローリングストーン
- 薄いリジー
昨年のブログエントリで解決策を見つけました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;
}
そして、クエリをadd_filter
beforeとremove_filter
after でラップします。
私はこれを試しましたが、私のサイトで次のエラーが表示され続けます:
WordPressデータベースエラー:[「order句」の不明な列「title2」]
SELECT wp_posts。* FROM wp_posts WHERE 1 = 1 AND wp_posts.post_type = 'release' AND(wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')ORDER BY UPPER(title2)ASC
嘘をつくつもりはありません。WordPressのphpの部分はかなり新しいので、このエラーが発生する理由についてはわかりません。「title2」列と関係があることがわかりますが、最初の関数がそれを処理する必要があることは私の理解でした。また、これを行う賢い方法があれば、私はすべて耳にします。私はこのサイトをあちこち探して検索しましたが、実際には多くの解決策を見つけていません。
フィルターを使用する私のコードは、助けになると次のようになります。
<?php
$args_post = array('post_type' => 'release', 'orderby' => 'title', 'order' => 'ASC', 'posts_per_page' => -1, );
add_filter('post_fields', 'wpcf_create_temp_column'); /* remove initial 'The' from post titles */
add_filter('posts_orderby', 'wpcf_sort_by_temp_column');
$loop = new WP_Query($args_post);
remove_filter('post_fields', 'wpcf_create_temp_column');
remove_filter('posts_orderby', 'wpcf_sort_by_temp_column');
while ($loop->have_posts() ) : $loop->the_post();
?>