1

次のクエリは、テーマの WordPress author.php テンプレートで機能しません。すべてのページで同じフッターであるフッターに含まれており、クエリは author.php を除く他のすべてのページで正常に機能します

  <?php if(have_posts()):?>
  <?php query_posts( array( 'post_type' => 'connect' ) ); while (have_posts()) : the_post(); ?>
  <div class="title"><?php the_title();?></div>
  <div class="logos">  
  <?php the_content();?>
  </div>
  <?php endwhile;?>
  <?php wp_reset_query(); ?>
  <?php endif;?>

何が起こっているのか、なぜこれがうまくいかないのかを理解するのに 1 時間以上費やしましたが、今ではコンクリートにぶつかっているように感じます。どうしてうまくいかないの!?

4

2 に答える 2

8

一部のページでしか機能しない理由を説明するには、query_posts()が実際に何をするのかを理解する必要があります。

query_posts()は、デフォルトのWordpressループを変更します。どのページを表示していても、コアによって初期化されるデフォルトのループが常にあります。そのループを変更する意図がない限り、query_posts()の使用を完全に停止することが不可欠です。

query_posts()が頻繁に誤用される理由はたくさんあり、それらは多くのフォーラムやWordpressCodex自体で詳しく説明されています。しかし、それはあなたの質問とは無関係な領域に入っています。

まず、コードが何をしているのか見てみましょう。

<?php if(have_posts()):?> //If the default loop finds posts....
<?php query_posts( array( 'post_type' => 'connect' ) );?> //Modify the loop to fit these new parameters

基本的に、新しいクエリは、デフォルトループが一連の結果を返すことができる場合にのみ実行されます。デフォルトループは通常ほとんどのシナリオで機能するため、これは他のページでも機能します。

何らかの理由で、変更されたクエリを実行するための一連の結果を返すことができないため、Author.phpテンプレートでは機能しません。

では、どのように修正しますか?

構造とクエリの呼び出し方法を変更する必要があります。あなたがプロジェクトにどれだけ深く関わっているかはわかりません。これがクライアントとのかなり厳しい締め切りになっている場合は、 WPクエリを優先してすべてのquery_posts()呼び出しを破棄することをお勧めします。

もう少し複雑に見えますか?もちろん。しかし、これを現在および将来のWordpressテーマのパンとバターにすることで、多くの時間と手間を省くことができます。

悪い方法

<?php
query_posts( array( 'post_type' => 'connect' ) );
if(have_posts()): while (have_posts()) : the_post();
?>
<div class="title"><?php the_title();?></div>
<div class="logos">  
<?php the_content();?>
</div>
<?php
endwhile;
wp_reset_query();
endif;
?>

適切な方法

<?php
$q = new WP_Query( array( 'post_type' => 'connect' ) );
if($q->have_posts()) : while($q->have_posts()) : $q->the_post;
?>
<div class="title"><?php the_title();?></div>
<div class="logos">  
<?php the_content();?>
</div>
<?php
endwhile;
wp_reset_postdata();
endif;
?>

これがお役に立てば幸いです。

アップデート:

WP_Queryを使用すると、作成者ごとに投稿をクエリできます。新しいWP_Queryオブジェクト内で提供されるデフォルト値は、通常、特定のページのデフォルトクエリを反映するという仮定は理にかなっているようであり、表示されている動作を説明できる可能性があります。

WP_Queryのドキュメントには、作成者タイプ「any」を明示的に検索する方法が実際には提供されていないため、これを少し汚さなければならない場合があります。

$user_ids = get_users(array('who'=>'author', 'fields'=>'ID'));
$q = new WP_Query( array( 'post_type' => 'connect', 'author'=>implode(',', $user_ids) ) );

それが役に立ったら教えてください。

于 2012-10-29T04:01:52.340 に答える
1

代わりにwpクエリを使用してみてください

$the_query = new WP_Query();
$the_query->query(array( 'post_type' => 'connect' ));
if ($the_query->have_posts()) : 
while($the_query->have_posts()) : $the_query->the_post();

endwhile; 
endif; 
wp_reset_postdata();

または、wp_queryが機能しない場合は、 get_postsを使用することもできます。これはauthor.phpで機能すると確信しています

global $post;
$args = array( 'post_type' => 'connect' );
$posts = get_posts( $args );
foreach( $posts as $post ): setup_postdata($post); 
   //you can call the_title the_content and any other method that runs under query_posts and WP_Query
endforeach; 
于 2012-10-29T03:58:08.640 に答える