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

  • 解決済 gakusei

    (@gakusei)



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

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

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

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

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

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

15件の返信を表示中 - 1 - 15件目 (全48件中)
  • gqevu6bsiz

    (@gqevu6bsiz)

    あなたの投稿を見て、iyaiyaさんのトピックに返信しました。

    たぶん、あのコードでgakuseiさんのご希望のソートが出来るんじゃないかと思います。
    http://ja.forums.wordpress.org/topic/13685?replies=9
    を見てみてください。

    gakusei

    (@gakusei)

    gqevu6bsizさんご回答ありがとうございます。

    gqevu6bsizさんの書いてくださったコードを貼り付けてみましたが、
    リストでもドロップダウンでも、やはりトップページに戻されてしまいます。

    ちなみに、なんの本か忘れてしまいましたが、本のコードを参考にして、
    以下のようなコードで記事一覧を出力するようにしています。

    <?php query_posts('posts_per_page=-1&' . $query_string); ?>
      <?php if(have_posts()): while(have_posts()):
    the_post(); ?>
      <?php endwhile; endif; ?>

    仮に上記のコードやソートのコードに誤りが無い場合、
    どのような問題が原因でトップページに戻されると考えることが出来るのでしょうか?

    失礼な返答で申し訳ありません。
    よろしくお願いします。

    gqevu6bsiz

    (@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; ?>

    ※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
    gakusei

    (@gakusei)

    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を使っているのですが、サーバーへの要求というのは仕方ないことなのでしょうか?

    初心者の質問で本当に申し訳ないです。
    もしよろしければ、ご回答よろしくお願いします。

    gqevu6bsiz

    (@gqevu6bsiz)

    >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に絞ってぐぐってみると、見つかるかもしれませんね。

    gakusei

    (@gakusei)

    gqevu6bsizさん

    ①ですが、header.phpでたなブログさんとKzさんのコードを挿入してみました。
    たなブログさんのコードについては、トップページに戻されてしまいました。
    Kzさんのコードについては、「認証が必要」と出てしまい、XAMPPで
    サーバー接続のためのパスワードとユーザー名を要求されました。

    ②ですが、上記のgqevu6bsizさんのコードを貼り付けてみました。
    その結果、「評価平均の多い順」と「評価をつけた人数の多い順」を選択すると、
    日付の新しい順に並び替えられ、
    「評価平均の少ない順」と「評価をつけた人数の少ない順」を選択すると、
    日付の古い順に並び替えられる、ということが起きました。

    なぜそうなるのか、調べてみてもよくわかりませんでした。

    なにか方法や対策があれば、ぜひ教えていただきたいです。

    一方的で申し訳ないですが、よろしくお願いします。

    gqevu6bsiz

    (@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の記載がないかどうか探してみてください。

    ※エラー文が表示された場合、出来る限りその文章をそのまま記載してください。

    gakusei

    (@gakusei)

    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さんが提示してくださいましたソートのコードを用いることは出来るのでしょうか?

    gqevu6bsiz

    (@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)してみたり。ですね。

    gakusei

    (@gakusei)

    gqevu6bsizさん 

    gqevu6bsizさんのコードで希望通りのものが出来ました。
    本当にありがとうございます。
    大変助かりました。

    ここまでしていただいて、さらに質問するのも申し訳ないのですが、
    日付の古い新しいや、アクセス数の多い少ないなどでもソートが出来ると
    より素晴らしいと感じ、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)等で、現在来ている値をしっかりデバッグすることをおすすめします。

    gakusei

    (@gakusei)

    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のプラグインを有効化したのですが、
    こちらも項目としてついかされませんでした。

    アクセス数やコメント数などは、また別のコードが必要なのでしょうか?

    gqevu6bsiz

    (@gqevu6bsiz)

    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 = ソート対象の配列

    gakusei

    (@gakusei)

    gqevu6bsizさん

    コメント数でのソートは出来ました。
    ありがとうございます。

    2つ気になることが出てきてしまいました。

    1つは、アクセス数についてです。
    アクセス数はソートは出来ませんでした。
    (実際にソートすると、日付順でソートされました。)
    いくつかサイトを見ていると

    orderby=meta_value_num&meta_key=カスタムフィールド名

    で評価とアクセス数についてはソート出来るとあり、
    カスタムフィールド名はviewsなので、ソート出来るかと思いましたが、無理でした。
    値が入っていることも確認できたので、ソートしない理由が見つけられませんでした。

    もう1つは、ドロップダウンリストについてです。

    category.phpで、
    評価平均の多い順
    評価平均の少ない順
    評価をつけた人数の多い順
    評価をつけた人数の少ない順
    アクセス数の多い順
    アクセス数の少ない順
    コメント数の多い順
    コメント数の少ない順

    というように並べたところ、
    上の4つだけで、アクセス数とコメント数が表示されませんでした。

    逆に、
    アクセス数の多い順
    アクセス数の少ない順
    コメント数の多い順
    コメント数の少ない順
    評価平均の多い順
    評価平均の少ない順
    評価をつけた人数の多い順
    評価をつけた人数の少ない順

    というように並べたところ、
    全ての項目が表示されました。

    これは、何か問題が発生しているのでしょうか?

    gqevu6bsiz

    (@gqevu6bsiz)

    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件中)
  • トピック「記事一覧の時のソートができません」には新たに返信することはできません。