2012-04-22 15 views
0

私はプラグインの中にショートコードを作成しました。 ショートコードはいくつかのパラメータを取り、出力を伴うカスタムループを作成する必要があります。wordpress query(shortcode)は、常に最初の投稿を返します。

パラメータの1つは、私はすべての記事($markers = '-1')からのデータ、時には唯一の($markers = '1')またはmuliple ($markers = 'x')を持っている必要がありますどのように多くの記事を出力する($マーカー)のためのループoccationsで

$args=array(
       'meta_key'=>'_mykey', 
       'post_status'=>'publish', 
       'post_type'=>'post', 
       'orderby'=>'date', 
       'order'=>'DESC', 
       'posts_per_page'=>$markers, 

); 

    $wp_query = new WP_Query(); 
      $wp_query->query($args); 

if ($wp_query->have_posts()) : while (($wp_query->have_posts())) : $wp_query->the_post(); 

// do the loop using get_the_id() and $post->id 

endwhile;endif; 
wp_reset_query();//END query 

です。

私は、この機能が複数の投稿(!is_single)と($ markers = '1')を持っている場所にあるときに、いつもそのページのデータを返します最新の投稿であり、正しいものではありません。 (たとえば、デフォルトのwordpressテーマでは、10個の投稿が表示されます - すべて同じデータです)

明らかに$post->IDの問題ですwpループの外にカスタムループを実行するときに正しいポストIDを持つことはできますか?

私は

global $post; 
$thePostIDtmp = $post->ID; //get the ID before starting new query as temp id 
$wp_query = new WP_Query(); 
$wp_query->query($args); 
// Start Custom Loop 

if (!is_single()){ 
$post_id_t = $thePostIDtmp;} 
else { 
$post_id_t = $post->ID;} 

して問題をovverride、その後$post_id_tを使用しようとした - )( は私がget_the_id使うべきではありませんが、動作しているようではないのですか?または私はクエリを使用しないでください(とget_postsを使用して)??

アイデア/解決策/考え方??

答えて

1

$ wpオブジェクトをオーバーライドするのではなく、query_posts(http://codex.wordpress.org/Function_Reference/query_posts)を使用します。あなたはこれで必要なだけ多くのループをページに含めることができるはずです。これに問題がある場合は、電話する直前にhttp://codex.wordpress.org/Function_Reference/wp_reset_queryを使用することができます。

私はこれを見つけます:http://blog.cloudfour.com/wordpress-taking-the-hack-out-of-multiple-custom-loops/ も痛みを取り去ります。

+0

私はquery_posts()またはget_posts()を使用する必要があると思っています。私の場合は助けにはならないと思われますが、確かにわかりません。 –

+0

投稿IDをエコーし​​てみましたかあなたはそれがいつ変わるかを見ることができます。 if文の中でそれをエコーすると、tmp変数を設定すると、何が起こっているのかを知るのに役立ちます。 – matpol

0

ワードプレスには、基本的に2種類の質問があります:メインループを変更するものとそうでないものがあります。カテゴリアーカイブページを表示するために使用されるようなメインループを変更する場合は、query_postsを使用します。それはまさにそれをやってみましょう。デフォルトのクエリのパラメータを削除、変更、追加して、一般的なページの結果を変更します。でも、 のquery_postsにはdrawbacksがあります。

次に、データベースから取り除くために使用されたクエリがあります。最新の投稿タイトルをサイドバーに表示するか、現在の投稿の添付ファイルを表示する。

// The Query 
$the_query = new WP_Query($args); 

// The Loop 
while ($the_query->have_posts()) : $the_query->the_post(); 
    echo '<li>'; 
    the_title(); 
    echo '</li>'; 
endwhile; 

// Reset Post Data 
wp_reset_postdata(); 

その後WP_Queryの弟のようなものですget_posts()がある:その独立しそうのようなメインループのカスタムループを構築する新しいWP_Queryオブジェクトを作成行うに

。それは私の意見では、より簡単なインターフェイスを持っており、より簡単な結果を持つ配列を返します。get_the_idのようなforeachのテンプレートタグ内

$myposts = get_posts($args); 
foreach($myposts as $post) : setup_postdata($post); 
    echo "<li>"; 
    the_title(); 
    echo "</li>"; 
endforeach; 

()に動作します: それはこのようになります。

+0

ありがとうございます。私はあなたの提案された方法を見ていきます。私の問題は、クエリが機能していないことではない - 私の問題は、最初の投稿を何度も何度も返すということです。基本的には - コンテンツ内の "普通の" wpループの中で私はショートコードを実行しますが、 'posts_per_page' => 1に設定すると、常に最初の(同じ)ポストが返されます。 get_the_id()は$ post-> IDと同様に動作しますが、常に同じポストの値を返します。そうでなければ、他のページで問題はありません(ワードプレスのループは常に1です)。 –

+0

"私の問題は、クエリが機能していないことではない - 私の問題は、最初のポストを繰り返し返す"ということです。クエリが機能していないように聞こえます;) メインクエリから離れてください。新しいWP_Queryオブジェクトを作成するか、get_posts()を使用しても問題はありません。 –

+0

さて、残念ながら私は今AFKを取得する必要がありますが、できるだけ早く試していきます。私のクエリは、説明されているものを除いて、すべての関数で正常に動作します。私は説明しようとします、私は2つの例の投稿を持って、1つは$マーカー= -1と他のマーカー= 1を持っています。私がget_postsを使用する場合、最初のものはpost_metaのための正確な同じデータを与え、2番目のものは素晴らしい投稿です。新しい投稿オブジェクトに変更すると、最初のものはうまく動作し、2番目のものは私はそれが少し混乱していることを知っている、私は戻ってすぐに例を投稿しようとします。 –

関連する問題