Как я могу сбросить запрос в пользовательском метабоксе WordPress - PullRequest
3 голосов
/ 15 декабря 2010

Я работаю над этим плагином для WordPress и застрял в запросе, который не будет сброшен.В следующей функции:

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 установлена ​​на самое последнее значение этого запроса, а не на значение по умолчанию на странице редактирования сообщений.

Мне бы очень хотелось услышать, как решить этот плагин.Может использовать все, чтобы получить меня в правильном направлении.Заранее спасибо!

Ура,

Ронни

1 Ответ

6 голосов
/ 21 октября 2011

Я столкнулся с этим сегодня и нашел исправление.

Вам нужно будет сохранить исходный $ 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;
...