記事一覧の時のソートができません
-
ワードプレス初心者です。
フォーラムも2度目ですが、よろしくお願いします。サイトを作るときに、ボタン一つで記事の並べ替えをしたいと思い、フォーラムを見たところ、
iyaiyaさんという方が
(記事一覧をドロップダウンリストでソートしたい)
というトピックを立てられていたので、そちらに出ているコードを
貼り付けてみたのですが、iyaiyaさんと同じように、トップページに戻されてしまいました。tanaka_kyousukeさんやnobitaさんのご指摘なども参考にしつつ、
コードの改善やプラグインの全停止などを行ってみましたが、
トップページに戻されてしまいました。最終的に、iyaiyaさんは3.4で動いたというお話でしたので、
実際に3.5から3.4へなんとかダウングレードを行いましたが、
やはりトップページに戻されてしまいました。ソートで良い方法はあるのでしょうか?
もし、わかる方がいらっしゃいましたら、ぜひ教えていただきたいです。
よろしくお願いします。
-
あなたの投稿を見て、iyaiyaさんのトピックに返信しました。
たぶん、あのコードでgakuseiさんのご希望のソートが出来るんじゃないかと思います。
http://ja.forums.wordpress.org/topic/13685?replies=9
を見てみてください。gqevu6bsizさんご回答ありがとうございます。
gqevu6bsizさんの書いてくださったコードを貼り付けてみましたが、
リストでもドロップダウンでも、やはりトップページに戻されてしまいます。ちなみに、なんの本か忘れてしまいましたが、本のコードを参考にして、
以下のようなコードで記事一覧を出力するようにしています。<?php query_posts('posts_per_page=-1&' . $query_string); ?> <?php if(have_posts()): while(have_posts()): the_post(); ?> <?php endwhile; endif; ?>
仮に上記のコードやソートのコードに誤りが無い場合、
どのような問題が原因でトップページに戻されると考えることが出来るのでしょうか?失礼な返答で申し訳ありません。
よろしくお願いします。>gakuseiさん
リストでもドロップダウンでも、やはりトップページに戻されてしまいます。
お手数お掛けしてすみません、動きませんでしたか。
<?php global $query_string; ?> <?php query_posts( 'posts_per_page=-1&' . $query_string ); ?> <?php if( have_posts()) : while( have_posts() ) : the_post(); ?> <?php /* Start the Loop */ ?> <?php endwhile; endif; ?>
※global を念の為追記しました。
トップページに戻される原因について、私のほうで考えられる推測ですが、
- .htaccessが上手く機能していない
- query_stringで現在のqueryをうまく取得出来ていない
- 使用しているテーマ・及びプラグインの影響を受けている
もしよろしければ下記を試してみてください。
1. パーマリンク設定が上手く機能していないのかもしれないので、
一度パーマリンクを「デフォルト」の設定にして、同じようにトップページに戻されるかどうか試してみてください。
※設定がデフォルトだとしても、一度必ず「変更を保存」のボタンを押して下さい。念の為です。2.
<?php $uri = home_url( '/' ); ?> <?php if( is_category() or is_tag() ) : ?> <?php $term = get_queried_object(); ?> <?php if ( $term ) : ?> <?php $uri = get_term_link( $term , $term->taxonomy ); ?><br> <?php endif; ?> <?php endif; ?> リスト形式<br> <ul style="background: #EEE;"> <li><a href="<?php echo add_query_arg( array( 'orderby' => 'comment_count' , 'order' => 'DESC' ), $uri ); ?>">コメントの多い順</a></li> <li><a href="<?php echo add_query_arg( array( 'orderby' => 'comment_count' , 'order' => 'ASC' ), $uri ); ?>">コメントの少ない順</a></li> <li><a href="<?php echo add_query_arg( array( 'orderby' => 'post_date' , 'order' => 'DESC' ), $uri ); ?>">日付の新しい順</a></li> <li><a href="<?php echo add_query_arg( array( 'orderby' => 'post_date' , 'order' => 'ASC' ), $uri ); ?>">日付の古い順</a></li> </ul> ドロップダウン形式<br> <select name="original-sort-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value="">ソート順を選択</option> <option value='<?php echo add_query_arg( array( 'orderby' => 'comment_count' , 'order' => 'DESC' ), $uri ); ?>'>コメントの多い順</option> <option value='<?php echo add_query_arg( array( 'orderby' => 'post_date' , 'order' => 'ASC' ), $uri ); ?>'>コメントの少ない順</option> <option value='<?php echo add_query_arg( array( 'orderby' => 'comment_count' , 'order' => 'DESC' ), $uri ); ?>'>日付の新しい順</option> <option value='<?php echo add_query_arg( array( 'orderby' => 'post_date' , 'order' => 'ASC' ), $uri ); ?>'>日付の古い順</option> </select>
このコードを、header.phpの<body>タグのすぐ下に記載して、
カテゴリ一覧のページやタグ一覧のページを表示して、クリックしてみて試してください。もしこの2の試しでソートが出来れば、category.php等に記載している何かが原因となります。
それでもトップページに戻されるようでしたら、gakusei さんの環境を、下記トピックを参考に出来るだけ、記載いただきたいです。
http://ja.forums.wordpress.org/topic/11794?replies=1
※私は下記の環境でソートできました。
- bitnami win vista
- wp:3.5
- php:5.3
- 使用テーマ:twentyeleven
gqevu6bsizさん
1のパーマリンクのデフォルトは変化がありませんでしたが、
2のheader.phpの<body>のすぐ下に入れた場合は動きました。gqevu6bsizさんがおっしゃってくださったように、
category.phpに何かしらの問題があるのかもしれないと思い、
いろいろいじってみましたが、問題を見つけられなかったので、
これからもう少し調べたいと思います。そこで、追加で申し訳ないのですが、もう3点追加で教えていただきたいです。
①gqevu6bsizさんのコードはなぜ、動いたのでしょうか
②ソートをカスタマイズしたいと思い、WP-PostRatingsとの組み合わせとして、
<option value='<?php echo add_query_arg( array( 'orderby' => 'meta_value_num' , 'meta_key=ratings_average' , 'order' => 'ASC' ), $uri ); ?>'>評価の高い順(平均)</option>
というコードにしてみたのですが、動きませんでした。
gqevu6bsizさんのコードのカスタマイズはどのように行うのがよいのでしょうか?③category.phpをいじっているときに、サーバーへの要求というページが出てくることがありました。
私はxamppを使っているのですが、サーバーへの要求というのは仕方ないことなのでしょうか?初心者の質問で本当に申し訳ないです。
もしよろしければ、ご回答よろしくお願いします。>gakusei さん
一歩前進してよかったですね!
先に上記3点についてですが、①私のコードで動くということはおそらく、http://ja.forums.wordpress.org/topic/13685?replies=8に記載されているたなブログさん(url直したバージョンで)、Kzさんのコードでも、header.phpに記載すると動くと思います。
動いた理由としてはheader.phpに記載することによって、category.phpやtag.php等に記載されている、何かしらの影響を受けていないからだと思われます。
②評価順でのソートにしようとしているんですね。
それであれば、そもそもあのコードで動かすのは難しいので、私のほうのcategory.phpの内容を全て貼り付けますので、divやcss等用途に合わせて変更して利用してみてください。<?php get_header(); ?> <section id="primary" class="site-content"> <div id="content" role="main"> <?php $uri = home_url( '/' ); ?> <?php if( is_category() or is_tag() ) : ?> <?php $term = get_queried_object(); ?> <?php if ( $term ) : ?> <?php $uri = get_term_link( $term , $term->taxonomy ); ?><br> <?php endif; ?> <?php endif; ?> ドロップダウン形式<br> <select name="original-sort-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value="">ソート順を選択</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_average' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_average' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>評価平均の多い順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_average' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_average' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>評価平均の少ない順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_users' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_users' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>評価をつけた人数の多い順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_users' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_users' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>評価をつけた人数の少ない順</option> </select> <?php // 何の指定もないときのデフォルトのソート順 $args = array( 'nopaging' => 1 , 'orderby' => 'meta_value' , 'order' => 'DESC' , 'meta_key' => 'ratings_average' ); if( is_category() ) { $args["cat"] = get_query_var( "cat" ); } elseif( is_tag() ) { $args["tag"] = get_query_var( "tag" ); } if( !empty( $_GET["meta_key"] ) ) { $args["meta_key"] = strip_tags( $_GET["meta_key"] ); } if( !empty( $_GET["order"] ) ) { $args["order"] = strip_tags( $_GET["order"] ); } ?> <?php query_posts( $args ); ?> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h1 class="archive-title"><?php printf( __( 'Category Archives: %s', 'twentytwelve' ), '<span>' . single_cat_title( '', false ) . '</span>' ); ?></h1> <?php if ( category_description() ) : ?> <div class="archive-meta"><?php echo category_description(); ?></div> <?php endif; ?> </header><!-- .archive-header --> <?php while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; twentytwelve_content_nav( 'nav-below' ); ?> <?php else : ?> <?php get_template_part( 'content', 'none' ); ?> <?php endif; ?> </div><!-- #content --> </section><!-- #primary --> <?php get_sidebar(); ?> <?php get_footer(); ?>
③すみません、ちょっと分からないですね。
もしかしたら、xamppに絞ってぐぐってみると、見つかるかもしれませんね。gqevu6bsizさん
①ですが、header.phpでたなブログさんとKzさんのコードを挿入してみました。
たなブログさんのコードについては、トップページに戻されてしまいました。
Kzさんのコードについては、「認証が必要」と出てしまい、XAMPPで
サーバー接続のためのパスワードとユーザー名を要求されました。②ですが、上記のgqevu6bsizさんのコードを貼り付けてみました。
その結果、「評価平均の多い順」と「評価をつけた人数の多い順」を選択すると、
日付の新しい順に並び替えられ、
「評価平均の少ない順」と「評価をつけた人数の少ない順」を選択すると、
日付の古い順に並び替えられる、ということが起きました。なぜそうなるのか、調べてみてもよくわかりませんでした。
なにか方法や対策があれば、ぜひ教えていただきたいです。
一方的で申し訳ないですが、よろしくお願いします。
gakusei さん
①についてですが、wordpressではなくxamppの影響の気がします。
- wordpressのURL
- 戻されるURL(たなブログさん、Kzさんの両方)
- xamppのディレクトリ構成(インストールしているディレクトリの場所と、wordpressを設置しているディレクトリの場所
問題解決の為にこちらを教えていただけますか?
参考に、
xamppインストール : C:\Users\(PCユーザー名)\xampp
wordpress設置ディレクトリ : C:\Users\(PCユーザー名)\xampp\htdocs\wordpress
wordpressURL : http://localhost/wordpress/“平均評価の少ない順”を選択した際のURL : http://localhost/wordpress/?cat=1&meta_key=ratings_average&order=ASC
“平均評価の多い順序”を選択した際のURL : http://localhost/wordpress/?cat=1&meta_key=ratings_average&order=DESC私のxamppの場合はこのようになります。
②についてですが、
おそらくどこかのファイルでquery_posts等、別のソートが読み込まれて、
評価順のソートの命令文を上書きされている気がします。※下記を試す際は、必ずプラグインを全停止させてください。
一度、インストールしたままのtwentytwelveテーマにして、
私が貼り付けたcategory.phpのコードをインストールしたままのcategory.phpに全て貼り付けてみて、理想通り動くかどうか試してみてください。
※WP-PostRatingsだけは有効化してください。そしていくつかの記事に評価を予めつけておいてください。→これで動く場合は、gakuseiさんが使用しているテーマのどこかが影響していることになります。
functions.php等、query_postsやwp_queryの記載がないかどうか探してみてください。※エラー文が表示された場合、出来る限りその文章をそのまま記載してください。
gqevu6bsizさん
①ですが、情報を記載します
たなブログさんの場合
xamppインストール : C:\Users\(PCユーザー名)\xampp
wordpress設置ディレクトリ : C:\Users\(PCユーザー名)\xampp\htdocs\wordpress
wordpressURL : http://localhost/wordpress/
“アクセス数の多い順”を選択した際のURL :http://localhost/wordpress/?narabi=sort5
“アクセス数の少ない順”を選択した際のURL :http://localhost/wordpress/?narabi=sort6※たなブログさんのソートに評価に関するものがなく、カスタマイズの方法が
わからなかったので、「アクセス数」を選択した場合を書きましたKzさんの場合
xamppインストール : C:\Users\(PCユーザー名)\xampp
wordpress設置ディレクトリ : C:\Users\(PCユーザー名)\xampp\htdocs\wordpress
wordpressURL : http://localhost/wordpress/※Kzさんのソートについては、評価に関するものがなく、カスタマイズの方法が
わからなかったので、「コメント数」を選択した場合を書きました。
しかし、Kzさんの場合は、どの項目をクリックしても、認証が必要
http://localhost:サーバーでは、ユーザー名とパスワードが必要です。
サーバーからのメッセージ:という表示が出てしまいました。
②については、インストールしたままのtwentytwelveテーマを使い、
gqevu6bsizさんのcategory.phpをコピーして貼り付けたところ、機能しました。また、私が現在使っているテーマでプラグインを全停止しても動きました。
そこで、category.phpの中身をいろいろといじっていたところ、
gqevu6bsizさんが書いてくださったコードの以下の部分<?php if ( have_posts() ) : ?> <header class="archive-header"> <h1 class="archive-title"><?php printf( __( 'Category Archives: %s', 'twentytwelve' ), '<span>' . single_cat_title( '', false ) . '</span>' ); ?></h1> <?php if ( category_description() ) : ?> <div class="archive-meta"><?php echo category_description(); ?></div> <?php endif; ?> </header><!-- .archive-header --> <?php while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; twentytwelve_content_nav( 'nav-below' ); ?> <?php else : ?> <?php get_template_part( 'content', 'none' ); ?> <?php endif; ?>
が、私のコードの以下の部分
<?php global $query_string; ?> <?php query_posts( 'posts_per_page=-1&' . $query_string ); ?> <?php if( have_posts()) : while( have_posts() ) : the_post(); ?> <?php /* Start the Loop */ ?> <?php endwhile; endif; ?>
とかぶるのではないかということがわかりました。
(以前、gqevu6bsizさんにglobalを追記していただいたコードです)ただ、上記で取り上げましたgqevu6bsizさんのコードが理解できず、
私のコードで記事のソートをすることが出来ませんでした。私は、
<?php global $query_string; ?> <?php query_posts('posts_per_page=-1&' . $query_string); ?> <?php if(have_posts()): while(have_posts()): the_post(); ?> <div class="title"> <?php get_template_part('content','title'); ?> </div> <div class="rating"> <?php if ( $ave = get_post_meta( $post->ID, 'ratings_average', true ) ) { $user = get_post_meta( $post->ID, 'ratings_users', true ); $gouke = get_post_meta( $post->ID, 'ratings_score', true ); $width = $ave * 16; echo '<span style="width:' . $width . 'px;">Rating: </span>'; echo '平均:' . $ave . ' 総合:' . $gouke . ''; } else { echo '(未評価です。)'; } ?> </div> <?php endwhile; endif; ?>
というようにして、記事のタイトル一覧を出力し、ソートとしようと考えています。
(評価に関しては、たなブログさんのコードを使わせてもらっています)上記の私のコードで、gqevu6bsizさんが提示してくださいましたソートのコードを用いることは出来るのでしょうか?
gakusei さん
だいぶ理想の動きに近づいてきましたね!
先にまず、
<?php global $query_string; ?>
<?php query_posts( ‘posts_per_page=-1&’ . $query_string ); ?>
<?php if( have_posts()) : while( have_posts() ) : the_post(); ?>
<?php /* Start the Loop */ ?>
<?php endwhile; endif; ?>は外してください。
※このコードでは、ご希望の“評価順”等のソートは出来ない為。gakuseiさんのコードを応用すると、
<?php $uri = home_url( '/' ); ?> <?php if( is_category() or is_tag() ) : ?> <?php $term = get_queried_object(); ?> <?php if ( $term ) : ?> <?php $uri = get_term_link( $term , $term->taxonomy ); ?><br> <?php endif; ?> <?php endif; ?> ドロップダウン形式<br> <select name="original-sort-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value="">ソート順を選択</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_average' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_average' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>評価平均の多い順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_average' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_average' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>評価平均の少ない順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_users' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_users' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>評価をつけた人数の多い順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_users' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_users' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>評価をつけた人数の少ない順</option> </select> <?php // 何の指定もないときのデフォルトのソート順 $args = array( 'nopaging' => 1 , 'orderby' => 'meta_value' , 'order' => 'DESC' , 'meta_key' => 'ratings_average' ); if( is_category() ) { $args["cat"] = get_query_var( "cat" ); } elseif( is_tag() ) { $args["tag"] = get_query_var( "tag" ); } if( !empty( $_GET["meta_key"] ) ) { $args["meta_key"] = strip_tags( $_GET["meta_key"] ); } if( !empty( $_GET["order"] ) ) { $args["order"] = strip_tags( $_GET["order"] ); } ?> <?php query_posts( $args ); ?> <?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <div class="title"> <?php get_template_part('content','title'); ?> </div> <div class="rating"> <?php if ( $ave = get_post_meta( $post->ID, 'ratings_average', true ) ) { $user = get_post_meta( $post->ID, 'ratings_users', true ); $gouke = get_post_meta( $post->ID, 'ratings_score', true ); $width = $ave * 16; echo '<span style="width:' . $width . 'px;">Rating: </span>'; echo '平均:' . $ave . ' 総合:' . $gouke . ''; } else { echo '(未評価です。)'; } ?> </div> <?php endwhile; ?> <?php endif; ?>
このようになるのではないかと思います。
このコードの流れとしては、
- 現在の $uri を取得(categoryやtagページなら、そのURL)
- 取得した $uri にプラス、各ソートに対するクエリをセットしてドロップダウン形式で表示
- リクエストされたクエリで、query_posts()をおこなう(記事の再取得)
- 記事があり、かつ記事の分だけループ
という流れです。
※今までは上記の3番の記事の再取得が複数おこなわれた為、上手く理想のソートができなかったと考えられます。あと、query_posts、オプションの値等を熟読すると、結構分かってくるかもしれません。
http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts
http://elearn.jp/wpman/function/query_posts.html
これで、動くことを願っております。。———————————-
それと、認証が必要なページの画面になってしまう、またはトップページに戻ってしまうとの事でしたが、ちょっと乱暴ですが、このトピックのお題が「記事一覧時のソート」ですので、今はとにかく理想通りに動くコードを参考にしたほうがいいかなと思います。
※時間がある時に、なぜ動かないのかをじっくり観察してみたほうがいいですね。
目星は、特にそれぞれのコードの URLにあたる 部分をvar_dump($url)してみたり。ですね。gqevu6bsizさん
gqevu6bsizさんのコードで希望通りのものが出来ました。
本当にありがとうございます。
大変助かりました。ここまでしていただいて、さらに質問するのも申し訳ないのですが、
日付の古い新しいや、アクセス数の多い少ないなどでもソートが出来ると
より素晴らしいと感じ、gqevu6bsizさんが書いてくださったコードをカスタマイズしようと考えたのですが、
やはり理解できず、カスタマイズも出来ませんでした。具体的には、どのあたりをどのようにカスタマイズするのがよいのでしょうか。
初心者ながら、何度も質問してしまい、申し訳ないです。
gakusei さん
ご希望通りのソートが出来て、なによりです。
日付やアクセス数のソートについてですが、
<?php // 何の指定もないときのデフォルトのソート順 $args = array( 'nopaging' => 1 , 'orderby' => 'meta_value' , 'order' => 'DESC' , 'meta_key' => 'ratings_average' ); if( is_category() ) { $args["cat"] = get_query_var( "cat" ); } elseif( is_tag() ) { $args["tag"] = get_query_var( "tag" ); } if( !empty( $_GET["meta_key"] ) ) { $args["meta_key"] = strip_tags( $_GET["meta_key"] ); } if( !empty( $_GET["order"] ) ) { $args["order"] = strip_tags( $_GET["order"] ); } ?> <?php query_posts( $args ); ?>
具体的にはまず、このコードにプラス、orderbyを取得できるよう変更しないといけません。
if( !empty( $_GET["meta_key"] ) ) { $args["meta_key"] = strip_tags( $_GET["meta_key"] ); }
を
if( !empty( $_GET["meta_key"] ) ) { $args["meta_key"] = strip_tags( $_GET["meta_key"] ); } elseif( !empty( $_GET["orderby"] ) ) { $args["orderby"] = strip_tags( $_GET["orderby"] ); unset( $args["meta_key"] ); }
このようにします。
そして、
$args = array( 'nopaging' => 1 , 'orderby' => 'meta_value' , 'order' => 'DESC' , 'meta_key' => 'ratings_average' ); /* ここは指定された値をもとにソートのデフォルト値を変更 */ <?php query_posts( $args ); ?>
この部分が、ソートの仕様を決めるものになります。
基本は order と orderby の組み合わせです。
例えば日付でのソートをする場合は、orderby に date が入ればよいのでこのようになります。
$args = array( ‘nopaging’ => 1 , ‘orderby’ => ‘date‘ , ‘order’ => ‘DESC‘ );また、ドロップダウンの部分は、日付のソートの場合だと、
<?php $Selected = ”; if( !empty( $_GET[“orderby“] ) && !empty( $_GET[“order”] ) ) : if( $_GET[“orderby“] == ‘date‘ && $_GET[“order”] == ‘DESC‘ ) : $Selected = ‘selected=”selected”‘; endif; endif; ?>
<option value=”<?php echo add_query_arg( array( ‘orderby’ => ‘date‘ , ‘order’ => ‘DESC‘ ), $uri ); ?>” <?php echo $Selected ?>>ここにソートの名前</option>
ascのほうはこれを参考につけてください。※アクセス数については、すみませんが分かりません。
“wordpressだけ” ではアクセス数は取得していないので、何かプラグイン等を入れないとそもそもアクセス数のソートは出来ないと思います。プラグインを入れた場合は、だいたいは、WP-PostRatings の時と同じようにカスタムフィールドの値をもとにソートをするはずなので、フィールド名を変更するぐらいで同じようなやり方になると思います。
$args = array( ‘nopaging’ => 1 , ‘orderby’ => ‘meta_value’ , ‘order’ => ‘DESC’ , ‘meta_key’ => ‘アクセス数に関係するカスタムフィールド名‘ );
ドロップダウンは
<?php $Selected = ”; if( !empty( $_GET[“meta_key”] ) && !empty( $_GET[“order”] ) ) : if( $_GET[“meta_key”] == ‘アクセス数に関係するカスタムフィールド名‘ && $_GET[“order”] == ‘ASC’ ) : $Selected = ‘selected=”selected”‘; endif; endif; ?>
<option value=”<?php echo add_query_arg( array( ‘meta_key’ => ‘アクセス数に関係するカスタムフィールド名‘ , ‘order’ => ‘ASC’ ), $uri ); ?>” <?php echo $Selected ?>>アクセス数順</option>このようになります。
※ $wp_query や var_dump($_GET)等で、現在来ている値をしっかりデバッグすることをおすすめします。
gqevu6bsizさん
ごめんなさい
まだ私が理解できていないだけなのかと思いますが、
ソートの項目を増やすことが出来ませんでした。一例ですが、
<?php $Selected = ''; if( !empty( $_GET["orderby"] ) && !empty( $_GET["order"] ) ) : if( $_GET["orderby"] == 'date' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'orderby' => 'date' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>ここにソートの名前</option>
というgqevu6bsizさんのコードで、日付のソートは出来ました。
そこで、コメント数でのソートも考え、調べてみたところ、
dateの部分をcomment_countに変更することで出来そうなので、やってみたところ、
出来ないというよりも、ソートの項目として追加されていませんでした。また、アクセス数に関しては、WP-Postviewsを使い、viewsを使うことで
出来ると分かったので
ratings_averageをviewsに変え、WP-Postviewsのプラグインを有効化したのですが、
こちらも項目としてついかされませんでした。アクセス数やコメント数などは、また別のコードが必要なのでしょうか?
gakusei さん
日付のソートは出来ました。
お、それはよかったです!
ソートの項目についてですが、WP-Postviewsについては確認しておりませんが、
viewsを使うという事なので、コメント数のcomment_countとviewsを前提に進めます。まず一例のコードを応用すると、
コメント数のドロップダウンは、<?php $Selected = ''; if( !empty( $_GET["orderby"] ) && !empty( $_GET["order"] ) ) : if( $_GET["orderby"] == 'comment_count' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'orderby' => 'comment_count' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>コメント多い順</option> <?php $Selected = ''; if( !empty( $_GET["orderby"] ) && !empty( $_GET["order"] ) ) : if( $_GET["orderby"] == 'comment_count' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'orderby' => 'comment_count' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>コメント少ない順</option>
アクセス数のコードは、
<?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'views' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'views' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>アクセスの多い順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'views' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'views' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>アクセスの少ない順</option>
になると思います。
(最初の想定よりもソートの対象が増えてきた為、ソートの対象を配列やオブジェクトに入れて、whileやforeach等で回したほうが効率いいかもしれません。余裕があれば)あとは、
if( !empty( $_GET["meta_key"] ) ) { $args["meta_key"] = strip_tags( $_GET["meta_key"] ); }
このコードは、以下
if( !empty( $_GET["meta_key"] ) ) { $args["meta_key"] = strip_tags( $_GET["meta_key"] ); } elseif( !empty( $_GET["orderby"] ) ) { $args["orderby"] = strip_tags( $_GET["orderby"] ); unset( $args["meta_key"] ); }
にしてください。
これで、コメント数とアクセス数によるソートが可能になると思います。
また、query_posts関数の直前に以下のコードを貼り付けて、現在のソートの値を確かめながら進める事をおすすめします。
<pre><?php print_r($args); ?></pre>
$args = ソート対象の配列
gqevu6bsizさん
コメント数でのソートは出来ました。
ありがとうございます。2つ気になることが出てきてしまいました。
1つは、アクセス数についてです。
アクセス数はソートは出来ませんでした。
(実際にソートすると、日付順でソートされました。)
いくつかサイトを見ているとorderby=meta_value_num&meta_key=カスタムフィールド名
で評価とアクセス数についてはソート出来るとあり、
カスタムフィールド名はviewsなので、ソート出来るかと思いましたが、無理でした。
値が入っていることも確認できたので、ソートしない理由が見つけられませんでした。もう1つは、ドロップダウンリストについてです。
category.phpで、
評価平均の多い順
評価平均の少ない順
評価をつけた人数の多い順
評価をつけた人数の少ない順
アクセス数の多い順
アクセス数の少ない順
コメント数の多い順
コメント数の少ない順というように並べたところ、
上の4つだけで、アクセス数とコメント数が表示されませんでした。逆に、
アクセス数の多い順
アクセス数の少ない順
コメント数の多い順
コメント数の少ない順
評価平均の多い順
評価平均の少ない順
評価をつけた人数の多い順
評価をつけた人数の少ない順というように並べたところ、
全ての項目が表示されました。これは、何か問題が発生しているのでしょうか?
gakusei さん
先に
もう1つは、ドロップダウンリストについてです。
ですが、ドロップダウンが4つしか表示されないようですが、</select>の後に追加ソート分のoptionを記載していませんか?
正しくは、
<select name="original-sort-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value="">ソート順を選択</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_average' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_average' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>評価平均の多い順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_average' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_average' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>評価平均の少ない順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_users' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_users' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>評価をつけた人数の多い順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'ratings_users' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'ratings_users' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>評価をつけた人数の少ない順</option> <!-- 付け足したコード --> <?php $Selected = ''; if( !empty( $_GET["orderby"] ) && !empty( $_GET["order"] ) ) : if( $_GET["orderby"] == 'comment_count' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'orderby' => 'comment_count' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>コメント多い順</option> <?php $Selected = ''; if( !empty( $_GET["orderby"] ) && !empty( $_GET["order"] ) ) : if( $_GET["orderby"] == 'comment_count' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'orderby' => 'comment_count' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>コメント少ない順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'views' && $_GET["order"] == 'DESC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'views' , 'order' => 'DESC' ), $uri ); ?>" <?php echo $Selected ?>>アクセスの多い順</option> <?php $Selected = ''; if( !empty( $_GET["meta_key"] ) && !empty( $_GET["order"] ) ) : if( $_GET["meta_key"] == 'views' && $_GET["order"] == 'ASC' ) : $Selected = 'selected="selected"'; endif; endif; ?> <option value="<?php echo add_query_arg( array( 'meta_key' => 'views' , 'order' => 'ASC' ), $uri ); ?>" <?php echo $Selected ?>>アクセスの少ない順</option> </select>
ここはwordpress等は関係なく、htmlの問題となります。
上記コードからドロップダウンでアクセス数、コメント数、評価全てのソートが動作することを確認しました。もし上記コードでもまだ動かないようなら、デバッグの情報も含めて記載してください。
<pre><?php print_r($args); ?></pre>
- トピック「記事一覧の時のソートができません」には新たに返信することはできません。