サポート » 使い方全般 » showpostsで件数の指定ができません

  • hajime9

    (@hajime9)


    初心者なので言葉がおかしかったらすみません。
    まず、ある記事の中に、特定カテゴリの記事(タイトルと本文の一部)を3件ほど表示させたくて、投稿編集でPHPが使えるように、Exec-PHP というプラグインを導入しました。

    私はPHPの知識は全然初心者なので、特定カテゴリの記事を表示するためのコードを色々と投稿内に入れてみたところ、このフォーラム内で見つけた下のコードで表示することができました。

    <?php
    query_posts($query_string . "&cat=10&showposts=3");
     if (have_posts()) :
      while (have_posts()) : the_post(); ?>
    <dl>
     <dt class="title"><a href="<?php the_permaLink(); ?>"><?php the_title(); ?></a></dt>
     <dd class="date"><?php the_time('Y.m.d'); ?>UP</dd>
     <dd class="text"><?php
       if ( has_post_thumbnail() ): // サムネイルを持っているときの処理
        ?><?php the_post_thumbnail( array(150,150), array('class' => 'imgLeft') ); ?><?php
       else: // サムネイルを持っていないときの処理
        ?><img src="<?php bloginfo('template_url') ?>/image/no_image.gif" alt="noimage" class="imgLeft" /><?php
       endif; ?><?php the_excerpt(); ?></dd>
     </dl><?php
      endwhile;
     endif;
    wp_reset_query();
    ?>

    この場合カテゴリIDが10の記事を3件表示させたかったのですが、
    そのカテゴリに属する記事が25件表示されてしまいます。
    (そのカテゴリには100件以上記事があります。)
    どこから25件がでてきたのかもわからないのですが
    (ダッシュボードからの?表示設定は10件に設定してあります。)
    showpostsの件数をいろいろ変えてみたのですが変わりません。

    何が原因かわかる方はいらっしゃますでしょうか?
    プラグインで投稿内に記述しているのが問題なのでしょうか。
    よろしくお願いいたします。

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

    (@cybercypher)

    showpostsは非推奨の命令になっています
    posts_per_pageを使用するようにしてください(-1ですべて表示です)

    どうしても取得できないのなら取得した件数ループするのではなく
    まず取得したものをソートし、その後、頭から3件ほど取得してはいかがでしょうか?

    トピック投稿者 hajime9

    (@hajime9)

    CyberCypherさんありがとうございます。
    query_posts($query_string . "&cat=10&showposts=3");

    query_posts($query_string . "&cat=10&posts_per_page=3");
    にしてみましたが、やはり同じように表示されてしまいます。

    取得した件数ループするのではなく
    まず取得したものをソートし、その後、頭から3件ほど取得

    というのが、基本がおそらくちゃんと理解できていないから
    だと思うのですが、何をどうしたら良いかすらわかりません。
    一部分ではなく、まるごとコードを変えなければならない感じ
    なのでしょうか。

    CyberCypher

    (@cybercypher)

    $query_stringには何が入っているのかな?
    直前の検索条件がなんでもないなら

    query_posts("cat=10&posts_per_page=3");

    でいいようなきがするんですが・・・
    出かけ前で余裕がないのでまた後ほど追記します

    トピック投稿者 hajime9

    (@hajime9)

    CyberCypherさんお忙しいところありがとうございます。

    query_stringを調べましたが説明文自体が理解不能でした。
    情けないのでwordpressの基本書を一冊買うことにします。。。

    このコードが載っていた元の記事を見たところ、仰るように
    query_stringの部分は有りませんでした。
    おそらく色んな記事を見て、一か八か部分部分を変えていたうちに
    入ってしまったのだと思います。後の部分は同じでした。

    ただ、やはりこの部分を削除しても表示は同じでした。
    やっぱりプラグインを使用して投稿内に記述しているからなのでしょうか。
    もしお時間があれば、
    取得した件数ループするのではなく
    まず取得したものをソートし、その後、頭から3件ほど取得
    というやり方を教えていただけませんでしょうか。

    本当は、
    特定カテゴリの最新(特定)記事の
    ・記事タイトル
    ・投稿日
    ・サムネイル画像
    ・本文(コードにあるような抜粋ではなく本文のmoreまでが理想です)
    を1件(1記事)表示して、
    続けて5件ほどは、
    ・記事タイトル
    ・投稿日
    だけを表示できるのが一番の理想なのですが、
    最初の段階で躓いてしまいました。

    こんなレベルでこういうことをしようとしていること自体が
    間違っているのかもしれませんが、できればお願いいたします。

    CyberCypher

    (@cybercypher)

    <?php
    //orderby:ソートの対象、order:昇・降順選択
    $querySTR = "cat=10&posts_per_page=3&orderby=ID&order=ASC";
    
    //$query_stringは直前の検索結果が格納されている、検索されていないと怖い
    //やりたいことが分からないがとりあえずくっつけるだけくっつける
    //検索結果とquery_postsのタグが一致してない可能性を考慮し後ろへ(最悪認識不可で前の物だけ処理されるかも)
    if($query_string!="" && $query_string!=null){
    	$querySTR = $querySTR."&".$query_string;
    }
    
    //queryが可変する場合は直接中に書かず外で編集する
    query_posts($querySTR);

    前半をこんな感じに・・・
    正直、理由がないなら
    $querySTR = $querySTR."&".$query_string;
    なんてしなくていいと思うんだけど
    (クエリを投げたり、検索してるかどうかも分からないし)

    それでも万が一動かないのなら

    if($query_string!=”” && $query_string!=null){
    $querySTR = $querySTR.”&”.$query_string;
    }

    を削除してみたり
    以下のように一度配列に放り込んで配列分だけ処理するとかじゃないかな?

    $posts = query_posts($querySTR);
    
    for($i=0;$i < 3;$i++){
    if(count($posts)==0){break;}
    $post=$posts[$i];
    ?>
    <dl>表示処理</dl>
    <?php
    }
    wp_reset_query();
    ?>

    トピック投稿者 hajime9

    (@hajime9)

    たびたびすみません。
    教えていただいた最初のコードを入れてみたのですが、

    Parse error: syntax error, unexpected T_ENDWHILE in ・・・

    と出てきます。
    入れ方が間違っているのでしょうか。

    <?php
    $querySTR = "cat=218&posts_per_page=3&orderby=ID&order=ASC";
    if($query_string!="" && $query_string!=null){
    	$querySTR = $querySTR."&".$query_string;
    }
    query_posts($querySTR);
    ?>
    <dl>表示処理</dl>
    <?php
      endwhile;
     endif;
    wp_reset_query();
    ?>

    <dl>表示処理</dl>の部分は、
    元のコードを入れてあります。
    次の削除するのもやってみましたが、同じエラーが出ました。

    一番下のコードも元のコードのどこに入れて良いものか
    色々試したのですがわからないのです。
    初心者過ぎて呆れられるかもしれませんが、
    教えていただけませんでしょうか。

    CyberCypher

    (@cybercypher)

    <?php
    query_posts($query_string . "&cat=10&showposts=3");
     if (have_posts()) :
      while (have_posts()) : the_post(); ?>

    と記述されていたと思います
    if以降が記述されていないのでループに入っていません

    先ほど説明した前半と言うのはquery_postsまでのことなので以降はそのままお使い下さい
    最後に書いた記述は一度全て行ってから駄目なようでしたらその時に・・・

    トピック投稿者 hajime9

    (@hajime9)

    大変失礼しました。

    まず、元のquery_postsまでの部分に入れてみました。

    <?php
    $querySTR = "cat=10&posts_per_page=3&orderby=ID&order=ASC";
    if($query_string!="" && $query_string!=null){
    	$querySTR = $querySTR."&".$query_string;
    }
    query_posts($querySTR);
    
    query_posts("&cat=218&posts_per_page=3");
     if (have_posts()) :
      while (have_posts()) : the_post(); ?>

    エラーは無くなりましたが、元の表示と変わらず件数指定が出来ていなかったので、
    なんかダブっているような気がする(すいませんホント素人で)
    query_posts("&cat=218&posts_per_page=3");
    を削除してみましたが、変わらず。

    次に、教えていただいたように、

    if($query_string!="" && $query_string!=null){
    $querySTR = $querySTR."&".$query_string;
    }

    を削除してみましたが、やはり変わらないようです。

    最後に書いた記述も試してみたいのですが、
    どの部分に入れれば良いかわかりません。
    お手数かけて本当に恐縮ですが、アドバイス頂けますでしょうか。

    CyberCypher

    (@cybercypher)

    <?php
    $querySTR = "cat=10&posts_per_page=3&orderby=ID&order=ASC"
    $posts = query_posts($querySTR);
    
    if(count($posts)!=0){
    for($i=0;$i < 3;$i++){
    $post=$posts[$i];
    ?>
    <dl>表示処理</dl>
    <?php
    }
    }
    wp_reset_query();
    ?>

    多分これでまるっと置き換えればできるのかと・・・

    トピック投稿者 hajime9

    (@hajime9)

    遅くなってすみません。
    まるっと置き換えてみたところ、

    Parse error: syntax error, unexpected T_VARIABLE in (略)/wp-content/plugins/exec-php/includes/runtime.php(42) : eval()’d code on line 3

    とエラーが出ました。
    これってやっぱりプラグインが問題なんでしょうか。。。

    CyberCypher

    (@cybercypher)

    すみません一行目”;”を忘れてました・・・
    行末に半角;を入力してあげてください
    evalとは文字列をphpのコードとして扱う命令なのですが
    構文エラーを自分が起こしてしまったのでエラーになってます

    トピック投稿者 hajime9

    (@hajime9)

    CyberCypherさんありがとうございます。
    これぐらいは私の方で気付くべきでした。すみません。

    教えていただいたもので、「表示処理」が3件でました!
    ということはその他の部分をちゃんと記述すれば
    ちゃんと表示できるってことですかね?
    <dl>表示処理</dl>
    の部分に元のコードの<dl>から</dl>を入れてみると、
    その投稿のタイトルと今日の日付が何十件も少しづつ右にズレながら
    表示されてサイドバーやフッターもどこかに行ってしまいました・・・

    やっぱりその部分も変えなきゃダメなんですよね。。。

    トピック投稿者 hajime9

    (@hajime9)

    まだ解決はしていませんが、ご報告です。
    Exec-PHPではなく、別のプラグイン、PHP Executionを入れて
    試してみましたが、同じ状態でした。
    (最初のコードで3件ではなく、25件表示されます。)
    ということは問題はプラグインではないということでしょうか。

    また、教えていただいたコードの表示処理という部分に、
    <a href="<?php the_permaLink(); ?>"><?php the_title(); ?></a>
    と入れてみたところ、その投稿内にPHPを書いた投稿のタイトル名リンク
    が3つ表示されてしまいました。
    ここで、指定したカテゴリの記事が3件出ると思ったのですが・・・
    そもそもの使い方が間違っているのでしょうか。

    もっと勉強します。。。

    モデレーター gatespace

    (@gatespace)

    こんにちは。横からスイマセン。

    まず、ある記事の中に、特定カテゴリの記事(タイトルと本文の一部)を3件ほど表示させたく

    であれば、そもそも論ですが、
    query_posts() ではなく、get_posts() を使う方がよろしいかと。

    おおざっぱに言うと query_posts はメインクエリ(今回は記事)を改変し、それと別のループ(今回は特定カテゴリの記事3件)を使う場合は get_posts がベターです。
    詳しくはCodexを参照してください。
    http://wpdocs.sourceforge.jp/The_Loop

    検証していませんが、はじめのコードを元にすると

    <?php
    // get_postsでカテゴリーID10の記事を3件取得
    $my_posts = get_posts( 'cat=10&posts_per_page=3' );
    
    // 上記条件の投稿があるなら
    if ($my_posts) {
    	// 最初に<dl>
    	echo "<dl>\n";
    	foreach ($my_posts as $post) : // ループスタート
    		setup_postdata($post); // the_title() などのテンプレートタグを使えるようにする ?>
    		<dt class="title"><a href="<?php the_permaLink(); ?>"><?php the_title(); ?></a></dt>
    		<dd class="date"><?php the_time('Y.m.d'); ?>UP</dd>
    		<dd class="text"><?php
    			if ( has_post_thumbnail() ): // サムネイルを持っているときの処理
    				the_post_thumbnail( array(150,150), array('class' => 'imgLeft') );
    			else: // サムネイルを持っていないときの処理
    			?><img src="<?php bloginfo('template_url') ?>/image/no_image.gif" alt="noimage" class="imgLeft" /><?php
    			endif; ?><?php the_excerpt(); ?>
    		</dd>
    	<?php
    		endforeach; // ループ終わり
    	// 最後に<dl>
    	echo "</dl>\n";
    }
    // クエリのリセット
    wp_reset_postdata();
    ?>

    こんな感じでしょうか。

    追伸:個人的な意見ですが、投稿編集でPHPを使えるプラグインはおすすめできません。
    (不具合あったり、投稿が壊れたり、などなど)
    できればショートコードで実現する方法も検討してみてください。

    トピック投稿者 hajime9

    (@hajime9)

    gatespaceさんありがとうございます。

    コードを入れてみた結果、やはり3件ではなく、25件表示され、
    タイトルと日付はそれぞれの記事のものではなく、PHPを挿入した記事の
    ものが表示されます。本文はそれぞれの記事のものです。
    本文も途中まで表示されますが、それぞれ文字数が違うのも原因が
    わかりません。あと、サムネイルも表示されなくなりました。

    細かい部分はご迷惑だと思うので、これから勉強したいと思いますが、
    件数表示だけはうまくいかなそうなので、何とか解決したいのですが・・・

    あと、追伸のアドバイスありがとうございます。
    そうだったんですね。
    ショートコードについても勉強してみます。

15件の返信を表示中 - 1 - 15件目 (全21件中)
  • トピック「showpostsで件数の指定ができません」には新たに返信することはできません。