サポート » 使い方全般 » 記事一覧の時のソートができません

  • 解決済 gakusei

    (@gakusei)


    ワードプレス初心者です。
    フォーラムも2度目ですが、よろしくお願いします。

    サイトを作るときに、ボタン一つで記事の並べ替えをしたいと思い、フォーラムを見たところ、
    iyaiyaさんという方が
    (記事一覧をドロップダウンリストでソートしたい)
    というトピックを立てられていたので、そちらに出ているコードを
    貼り付けてみたのですが、iyaiyaさんと同じように、トップページに戻されてしまいました。

    tanaka_kyousukeさんやnobitaさんのご指摘なども参考にしつつ、
    コードの改善やプラグインの全停止などを行ってみましたが、
    トップページに戻されてしまいました。

    最終的に、iyaiyaさんは3.4で動いたというお話でしたので、
    実際に3.5から3.4へなんとかダウングレードを行いましたが、
    やはりトップページに戻されてしまいました。

    ソートで良い方法はあるのでしょうか?

    もし、わかる方がいらっしゃいましたら、ぜひ教えていただきたいです。
    よろしくお願いします。

15件の返信を表示中 - 1 - 15件目 (全48件中)
  • あなたの投稿を見て、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; ?>

    このようになるのではないかと思います。

    このコードの流れとしては、

    1. 現在の $uri を取得(categoryやtagページなら、そのURL)
    2. 取得した $uri にプラス、各ソートに対するクエリをセットしてドロップダウン形式で表示
    3. リクエストされたクエリで、query_posts()をおこなう(記事の再取得)
    4. 記事があり、かつ記事の分だけループ

    という流れです。
    ※今までは上記の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 ); ?>

    この部分が、ソートの仕様を決めるものになります。

    ■ ソートの値
    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

    基本は 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>

15件の返信を表示中 - 1 - 15件目 (全48件中)
  • トピック「記事一覧の時のソートができません」には新たに返信することはできません。