サポート » 使い方全般 » query_posts を使わずに特定のカテゴリーかつ特定のタグへのリンクを表示

  • こんにちは。

    記事内でPHPをExec-PHPで動かしています。

    やりたいことは、

    カテゴリーA カテゴリーB
    タグC

    が存在していて、

    記事内からカテゴリBかつタグCへのリンクが張りたい。
    カテゴリAへアクセスしたときは昇順
    タグCへアクセスしたときは降順
    というように表示順序を制御したい。

    ということです。

    記事内に、特定のカテゴリーかつ特定のタグへのリンクが張りたくて、
    記事内に次のように書いています。

    <?php query_posts("cat=B&tag=C"); ?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <a href="<?php the_permalink(); ?>">カテゴリーBかつタグCへのリンク</a>
    <?php endwhile; else: ?>
    記事はありません
    <?php endif; ?>
    <?php wp_reset_query(); ?>

    それとは別に
    [archive.php]
    にはメッセージループの前に次のように書いています。

    <?php if (is_tag()) {query_posts($query_string .'&posts_per_page=10&order=DESC'); }
    else{query_posts($query_string .'&posts_per_page=10&order=ASC'); }?>

    これで、たとえばカテゴリーAに行くとカテゴリーA内の記事が表示はされますが、
    カテゴリーAに投稿された一番最古の記事が、一番最初に表示され、かつ 
    二件目からは指定した表示順序を無視して並びます。
    そして最後にもう一度一番最古の記事が表示されるので、一番最古の記事は2回表示されてしまいます。
    [archive.php] のループ前のphp if から始まる条件を除くとその現象はおきません。
    ですが、表示順序を変えたいのでこれは必要です。
    記事内でPHPのループを使うことで、ループの中にループがあるということで、表示が崩れているのでしょうか。。。
    query_posts を記事内で使わなければいいような気がしているんですが、そのような方法がわかりません。
    よろしくお願いします。`

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック投稿者 Naoki-Jo

    (@naoki-jo)

    もうひとつ原因になりそうな箇所がありました。

    ヘッダー、左サイドバー、コンテンツ、右サイドバー
    という順番でウェブサイトは表示されています。

    左サイドバーの中で特定のカテゴリの昨日から90日後までの記事のタイトルを表示させるため、次のように書いています。
    未来日時の設定の投稿は表示されるようにしてあります。

    <?php function filter_where($where = '') {
        $where .= " AND post_date >= '" . date('Y-m-d', strtotime('-1 days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('+90 days')) . "'";
        return $where;
      }
    add_filter('posts_where', 'filter_where');
    query_posts("numberposts=10&cat=3&order=ASC"); ?>
    
    <?php if(have_posts()):while(have_posts()):the_post(); ?>
    
    	<a href="<?php the_permalink() ?>"><?php the_title(); ?><br /></a>
    
    <?php endwhile; endif; ?>
    <?php wp_reset_query(); ?>

    これも原因のひとつでしょうか。

    記事内でPHPをExec-PHPで動かしています

    ショートコードを使用してみてはいかがでしょうか。
    記事内でphpを使用する方法及びそのプラグインの使用はセキュリティを落とすと言われています。まあ、ショートコードの方が見た目にもきれいですしね!

    トピック投稿者 Naoki-Jo

    (@naoki-jo)

    ご教授、ありがとうございます。
    ショートコードで目的のリンク、特定のカテゴリかつ特定のタグの作成はできました。

    function linktoalllive_func($atts, $content = null) {
            extract(shortcode_atts(array(
                    "dcat" => '',
    "dnen" => '',
                    "dtag" => ''
            ), $atts));
    
    query_posts("year=$dnen&monthnum=$dcat&cat=3&tag='.$dtag");
    $retour='
    <ul>';
    if ( have_posts() ) :
      while ( have_posts() ) :
        the_post();
    $retour.='
    <a href="'.get_permalink().'">'.the_title("","",false).'</a>
    
    ';
    
      endwhile;
    $retour.='</ul>
    
     ';
    else:
    $touroku='<a href="http://solo-guitar.info/regist_schedule/">登録する</a>';
    return "スケジュールはまだ登録されていません $touroku.";
    endif;
    wp_reset_query();
            return $retour.$content ;
    }
    
    add_shortcode( 'linktoalllive', 'linktoalllive_func' );

    このようにしました。

    ところが、当初の問題はまだ解決できません。

    記事
    A 1月に投稿 カテゴリ X
    B 2月に投稿 カテゴリ X
    C 3月に投稿 カテゴリ X
    D 4月に投稿 カテゴリ X
    E 5月に投稿 カテゴリ Y タグ Z

    カテゴリXにアクセスした場合、

    query_posts(“posts_per_page=10&cat=X&order=ASC”);

    として
    A
    B
    C
    D
    というふうに表示します。これは問題ありません。

    ところが記事Bから記事Eへのリンクをショートコードを使用して挿入すると、

    A
    B
    D
    C
    B
    A

    といったような並び順になってしまい、
    ショートコードでリンクを張ったところ以降は当初の並び順を無視してしまいます。

    ショートコード中の
    query_posts
    が何か影響を与えているのでしょうか。

    wp_reset_query();

    をはずしてみても思い通りの並び順は実現できませんでした。

    どなたか何かいい方法がありましたら
    ご教授ください。

    お願いいたします。

    query_postsでループを制御するのではなくて、get postsでループを取得してから配置するとかではだめなんでしょうか。まあ、

    query_posts 関数はメインの WordPress ループだけを変更するためのものです。新たなループを作るためのものではありません。メインループの他にループが必要な場合は、別の WP_Query オブジェクトを作ってください。メインループの他で query_posts を使用すると、メインループが不正な状態になり期待する結果が得られません。

    query_posts 関数はページのメインクエリを上書きし、置き換えます。他の目的で使用してはいけません。

    とも書かれていますし・・・カテゴリーリンクを作るためだけなら他の方法を模索した方が早い気がしますね;)

    トピック投稿者 Naoki-Jo

    (@naoki-jo)

    ありがとうございます。
    おっしゃるように、get postsで取得で配置で、
    記事の順序の問題は解決しました。

    function sc_liste($atts, $content = null) {
            extract(shortcode_atts(array(
                    "num" => '5',
    "tag" => '',
                    "cat" => ''
            ), $atts));
    
            global $post;
            $myposts = get_posts("tag='.$tag&category=$cat");
            $retour='
    <ul>';
            foreach($myposts as $post) :
                    setup_postdata($post);
                 $retour.='
    <li><a href="'.get_permalink().'">'.the_title("","",false).'</a></li>
    
    ';
            endforeach;
            $retour.='</ul>
    
     ';
            return $retour;
    }
    
    add_shortcode("list", "sc_liste");

    このコードに
    if()
    else

    を入れて、
    記事内でたとえばショートコードで
    [list tag=”z” cat=”A”]
    とした場合に、
    この記事が存在する場合は、リンクを表示。
    存在しない場合は、
    「存在しません」
    というように表示したいのですが、

    いろいろ試しているのですが出来ずにいます。

    どこにどうやってどのような条件を使って
    if()
    else
    を入れればいいのかがわかりません。

    何度も質問してすみませんが、ご教授お願いいたします。

    リストを作る前に条件を入れればよさそうです。
    たとえば

    if(count($myposts)){
    	foreach($myposts as $post) :
    		setup_postdata($post);
    		$retour.='<li><a href="'.get_permalink().'">'.the_title("","",false).'</a></li>';
    	endforeach;
    	$retour.='</ul> ';
    }else{
    	$retour = '存在しません';
    }
    return $retour;

    のような感じで。

    トピック投稿者 Naoki-Jo

    (@naoki-jo)

    できました!
    ありがとうございます。

    おかげさまで予定していた仕組みのウェブサイトが出来そうです!

    本当にありがとうございます!

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「query_posts を使わずに特定のカテゴリーかつ特定のタグへのリンクを表示」には新たに返信することはできません。