2010-12-15 46 views
3

Je travaille sur ce plugin pour wordpress et je suis bloqué sur une requête qui ne sera pas réinitialisée. Dans la fonction suivante:Comment puis-je réinitialiser une requête dans un custom wordpress metabox

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

J'utilise un query_posts pour remplir un METABOX. Mais le wp_reset_query(); ne semble pas fonctionner correctement. Cela affecte tous les autres métaboxes et l'option liée à la publication. La variable globale $ post est définie sur la dernière valeur de cette requête, et non sur la valeur par défaut de la page d'édition posts.

J'aimerais entendre comment résoudre ce plugin. Pourrait utiliser tout pour me mettre dans la bonne direction. Merci d'avance!

Cheers,

Ronny

+1

enfin trouvé quelqu'un avec le même problème que moi – Zach

Répondre

6

je suis tombé sur aujourd'hui et a trouvé une solution.

Vous devrez stocker le montant $ d'origine avant de commencer une nouvelle boucle, puis à la fin de votre fonction, vous devrez le rétablir.

Avant de commencer, affectez $ post à une variable temporaire.

$original_query = $wp_query; 

Puis à la fin de votre fonction de réglage en arrière.

$wp_query = $original_query; 
    wp_reset_postdata(); 

Vous ne savez pas si ce qui précède fonctionne dans votre cas car j'utilisais une requête personnalisée.

J'ai posté mon code ci-dessous afin que vous puissiez jeter un oeil.

  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

je sais que je suis 2 ans de retard pour ajouter ce commentaire, mais je voulais dire qu'il est toujours applicable. J'ai créé une boucle personnalisée à l'intérieur d'une métabox, en utilisant WP-Query, et tous mes autres appels personnalisés postmatériaux étaient en train de se gâter. wp_reset_postdata n'a rien fait du tout. Le stockage de l'original et la réinitialisation manuelle ont finalement permis de le corriger. Je vous remercie! –

+0

Jamie c'est tout simplement incroyable. C'est comme une réponse cachée :) –

+1

Après presque 3 heures à fouiner, cela a résolu le problème auquel je faisais face. J'exécutais une requête personnalisée dans une métabox, et il était en train de bousiller la variable $ post globale de la page d'édition. C'est de l'or! Merci d'avoir posté cette réponse. – EHerman