3

私はワードプレス用のこのプラグインに取り組んでいますが、リセットされないクエリで立ち往生しています。次の関数では:

function WPSM_artists_autocomplete(){

 $response = array();

 query_posts('post_type=artist&posts_per_page=-1');

  if (have_posts()) : while (have_posts()) : the_post();
   $image_id = get_post_thumbnail_id();  
  $image_url = wp_get_attachment_image_src($image_id,'artist-icon');  
  $image_url = $image_url[0];  

  $response[] = array( get_the_ID() , get_the_title() , null, '<img src="'.$image_url.'" />'. get_the_title()); 
    endwhile; endif;

    wp_reset_query();

    // Write JSON file
 $output = json_encode($response);
 $data = WPSM_CACHE_DIR."/data.json";
 $fh = fopen($data, 'w') or die("can't open file");
 fwrite($fh, $output);
 fclose($fh);

 // Return JSON url
 echo WPSM_CACHE_URL."/data.json";
}

query_posts を使用してメタボックスに入力します。しかし wp_reset_query(); 正しく動作していないようです。これは、他のすべてのメタボックスと投稿関連のオプションに影響します。グローバル $post 変数は、投稿編集ページのデフォルト値ではなく、このクエリの最新の値に設定されます。

このプラグインの解決方法を知りたいです。すべてを使って私を正しい方向に導くことができました。前もって感謝します!

乾杯、

ロニー

4

1 に答える 1

6

私は今日これに出くわし、修正を見つけました。

新しいループを開始する前に元の $post を保存する必要があり、関数の最後で元に戻す必要があります。

機能する前に、$post を一時変数に割り当てます。

$original_query = $wp_query;

次に、関数の最後に元に戻します。

   $wp_query = $original_query;
   wp_reset_postdata();

カスタムクエリを使用していたため、上記があなたのケースで機能するかどうかはわかりません。

以下にコードを掲載しましたので、ご覧ください。

            global $wpdb;
            global $post;
            $originalpost = $post;

            $querydetails = "
                SELECT *
                FROM $wpdb->posts
                WHERE $wpdb->posts.post_type = 'projects'
                AND $wpdb->posts.post_status = 'publish'
                ORDER BY $wpdb->posts.post_date DESC
             ";

             $pageposts = $wpdb->get_results($querydetails, OBJECT);

             if ($pageposts) {
                 foreach ($pageposts as $post) { 
                       setup_postdata($post);

                        $postID = get_the_ID();
                        echo '<option value="';
                        echo $postID . '"';
                        foreach ($meta as $m) {
                            if ($postID == $m) echo ' selected="selected" ';
                        }               
                        echo '>';
                        echo the_title();
                        echo '</option>';
                 }
            }

            echo "</select>";
            $this->show_field_end($field, $meta);
            $post = $originalpost;
于 2011-10-21T06:53:58.750 に答える