2010-12-15 4 views
3

Ich arbeite an diesem Plugin für WordPress und ich bin auf eine Abfrage fest, die nicht zurückgesetzt wird. In der folgenden Funktion:Wie kann ich eine Abfrage in einem benutzerdefinierten WordPress Metabox zurücksetzen

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"; 
} 

Ich benutze eine query_posts eine metabox zu füllen. Aber die wp_reset_query(); scheint nicht richtig zu funktionieren. Dies betrifft alle anderen Metaboxen und Post-bezogene Optionen. Die globale $ post-Variable wird auf den letzten Wert dieser Abfrage und nicht auf den Standardwert der Posts-Bearbeitungsseite gesetzt.

Ich würde gerne hören, wie dieses Plugin zu lösen. Könnte alles nutzen, um mich in die richtige Richtung zu bringen. Danke im Voraus!

Cheers,

Ronny

+1

gefunden Endlich mal jemand mit dem gleichen Problem wie ich – Zach

Antwort

6

ich auf diese heute kam und ein Update gefunden.

Sie müssen den ursprünglichen $ post speichern, bevor Sie eine neue Schleife starten, und am Ende Ihrer Funktion müssen Sie sie zurückstellen.

Bevor Sie funktionieren, weisen Sie $ post einer temporären Variablen zu.

$original_query = $wp_query; 

Dann am Ende Ihrer Funktion setzen Sie es zurück.

$wp_query = $original_query; 
    wp_reset_postdata(); 

Nicht sicher, ob das oben in Ihrem Fall funktioniert, da ich eine benutzerdefinierte Abfrage verwendete.

Ich habe meinen Code unten gepostet, damit Sie einen Blick darauf werfen können.

  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; 
+0

Ich weiß, ich bin 2 Jahre zu spät diesen Kommentar hinzufügen, aber ich wollte sagen, dass es immer noch anwendbar ist. Ich habe eine benutzerdefinierte Schleife in einer Metabox erstellt, die WP-Query verwendet, und sie hat alle meine anderen benutzerdefinierten Postmeta-Aufrufe durcheinander gebracht. wp_reset_postdata hat gar nichts gemacht. Das Original zu speichern und dann manuell zu resetten, hat es endgültig behoben. Vielen Dank! –

+0

Jamie das ist einfach unglaublich. Dies ist wie eine versteckte Antwort :) –

+1

Nach fast 3 Stunden stochern, löste dies tatsächlich das Problem, das ich konfrontiert war. Ich habe eine benutzerdefinierte Abfrage in einer Metabox ausgeführt und dabei die globale $ post-Variable der Bearbeitungsseite vermasselt. Das ist Gold! Vielen Dank, dass Sie diese Antwort gesendet haben. – EHerman

Verwandte Themen