Reset the query within plugin
-
Hi all,
I’m working on a new plugin but i came across a very frustrating issue.
I register several metaboxes and in a few of them i use a query. Now to get my metavalue for the other metaboxes i useget_post_meta($post->ID,'_social',TRUE);
However the metabox with the query in it somehow resets the $post variable. And i can’t reset the query withwp_reset_query()
. I’ve tried all kinds of querying and unset methods. But none of them seem to work.My file structure is like this:
- wp-stagemanager.php
- admin(folder)
- artists.php
- events.php
- metaboxes.php
- assets(folder)
- css(folder)
- img(folder)
- js(folder)
- cache(folder)
- data.json
- front(folder)
- functions.php
in wp-stagemanager.php i include the admin/metaboxes.php which has the following code…
<?php add_action('admin_init', 'WPSM_add_metabox', 1); add_action('save_post', 'WPSM_save_metabox'); function WPSM_add_metabox() { add_meta_box( 'WPSM_meta_social', __( 'Social Media', 'wp-stagemanager_textdomain' ), 'WPSM_init_meta_social', 'artist' ); add_meta_box( 'WPSM_meta_datetime', __( 'Event Date & Time', 'wp-stagemanager_textdomain' ), 'WPSM_init_meta_datetime', 'event'); add_meta_box( 'WPSM_meta_tickets', __( 'Event Tickets', 'wp-stagemanager_textdomain' ), 'WPSM_init_meta_tickets', 'event' ); add_meta_box( 'WPSM_meta_artists', __( 'Event Artists', 'wp-stagemanager_textdomain' ), 'WPSM_init_meta_artists', 'event' ); } function WPSM_init_meta_social(){ global $post; $social = get_post_meta($post->ID,'_social',TRUE); $socialnonce = wp_create_nonce(__FILE__); ?> <div class="social_meta_control"> <table width="100%"> <tr> <td> <label for="web" >Website</label> <input type="text" name="_social[web]" id="web" value="<?php if(!empty($social['web'])) echo $social['web']; ?>"/> </td> <td> <label for="ms">MySpace</label> <input type="text" name="_social[mysp]" id="ms" value="<?php if(!empty($social['mysp'])) echo $social['mysp']; ?>"/> </td> <td> <label for="yt">YouTube</label> <input type="text" name="_social[yout]" id="yt" value="<?php if(!empty($social['yout'])) echo $social['yout']; ?>"/> </td> </tr> <tr> <td> <label for="fb">Facebook</label> <input type="text" name="_social[face]" id="fb" value="<?php if(!empty($social['face'])) echo $social['face']; ?>"/> </td> <td> <label for="sp">Spotify</label> <input type="text" name="_social[spot]" id="sp" value="<?php if(!empty($social['spot'])) echo $social['spot']; ?>"/> </td> <td> <label for="la">last.fm</label> <input type="text" name="_social[last]" id="la" value="<?php if(!empty($social['last'])) echo $social['last']; ?>"/> </td> </tr> </table> <p class="description">Insert the full url to artist website or social media </p> </div> <input type="hidden" name="social_nonce" value="<?php echo $socialnonce ?>" /> <?php } function WPSM_init_meta_datetime(){ global $post; $startdate = get_post_meta($post->ID,'_startdate',TRUE); $startdatenonce = wp_create_nonce(__FILE__); $enddate = get_post_meta($post->ID,'_enddate',TRUE); $enddatenonce = wp_create_nonce (__FILE__); $time = get_post_meta($post->ID,'_time',TRUE); $timenonce = wp_create_nonce (__FILE__); ?> <div class="date_meta_control"> <script> jQuery(function() { var dates = jQuery( "#from, #to" ).datepicker({ showButtonPanel: true, onSelect: function( selectedDate ) { var option = this.id == "from" ? "minDate" : "maxDate", instance = jQuery( this ).data( "datepicker" ); date = jQuery.datepicker.parseDate( instance.settings.dateFormat || jQuery.datepicker._defaults.dateFormat, selectedDate, instance.settings ); dates.not( this ).datepicker( "option", option, date ); dates.datepicker( "option", "dateFormat", 'yy-mm-dd' ); } }); jQuery('#time').timeEntry({show24Hours: true}); }); </script> <table width="100%"> <tr> <td> <label for="from">Start date</label> <input type="text" id="from" name="_startdate" value="<?php if(!empty($startdate)) echo $startdate; ?>"/> </td> <td> <label for="to">End date</label> <input type="text" id="to" name="_enddate" value="<?php if(!empty($enddate)) echo $enddate; ?>" /> </td> <td> <label for="time">Time</label> <input type="text" id="time" name="_time" value="<?php if(!empty($time)) echo $time; ?>" /> </td> </tr> </table> </div> <input type="hidden" name="startdate_nonce" value="<?php echo $startdatenonce ?>" /> <input type="hidden" name="enddate_nonce" value="<?php echo $enddatenonce ?>" /> <input type="hidden" name="time_nonce" value="<?php echo $timenonce ?>" /> <?php } function WPSM_init_meta_tickets(){ global $post; $tickets = get_post_meta($post->ID,'_tickets',TRUE); $ticketsnonce = wp_create_nonce (__FILE__); ?> <div class="ticket_meta_control"> <table> <tr> <td> <label for="tlink" >Ticket Link</label> <input type="text" name="_tickets[link]" id="tlink" value="<?php if(!empty($tickets['link'])) echo $tickets['link']; ?>"/> </td> <td> <label for="tprice">Price</label> <input type="text" name="_tickets[price]" id="tprice" value="<?php if(!empty($tickets['price'])) echo $tickets['price']; ?>"/> </td> </tr> </table> </div> <input type="hidden" name="tickets_nonce" value="<?php echo $ticketsnonce ?>" /> <?php } function WPSM_init_meta_artists(){ global $post; $artists = get_post_meta($post->ID,'_artists',TRUE); $artistsnonce = wp_create_nonce (__FILE__); ?> <div class="artists_meta_control"> <table width="100%"> <tr> <td> <div class="form_artists"> <input type="text" name="_artists" value="" id="fas" /> </div> <script type="text/javascript" charset="utf-8"> jQuery(function($){ var t4 = new $.TextboxList('#fas', {unique: true, plugins: {autocomplete: {}}}); <?php //WPSM_artists_selected($artists); ?> t4.getContainer().addClass('textboxlist-loading'); $.ajax({url: '<?php WPSM_artists_autocomplete(); ?>', dataType: 'json', success: function(r){ t4.plugins['autocomplete'].setValues(r); t4.getContainer().removeClass('textboxlist-loading'); }}); }); </script> </td> </tr> </table> </div> <input type="hidden" name="artists_nonce" value="<?php echo $artistsnonce ?>" /> <?php query_posts($query_string); } function WPSM_artists_autocomplete(){ global $post; global $wpdb; global $wp_query; $response = array(); $artists = $wpdb->get_results(" SELECT * FROM $wpdb->posts AS <code>post</code> WHERE post.post_status = 'publish' AND post.post_type = 'artist' "); if($artists){ foreach($artists as $poster){ setup_postdata($poster); $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()); } } wp_reset_query(); $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); echo WPSM_CACHE_URL."/data.json"; } function WPSM_artists_selected($arr){ global $wp_query; $wp_query = new WP_Query( array( 'post_type' => 'artist', 'posts_per_page' => -1 ) ); while ( $wp_query->have_posts() ) : $wp_query->the_post(); if(in_array(get_the_ID(),$arr)){ echo "t4.add('".get_the_title()."','".get_the_ID()."');"; } endwhile; wp_reset_query(); } function WPSM_save_metabox($post_id){ $boxes = array('_startdate','_enddate','_time','_tickets','_artists'); foreach($boxes as $box){ // Strip underscore $box_name = str_replace('_','',$box); // Check metabox if (!wp_verify_nonce($_POST[$box_name.'_nonce'],__FILE__)) return $post_id; // Check data $current_data = get_post_meta($post_id, $box, TRUE); $new_data = $_POST[$box]; // Remove Duplicates if($box == '_artists'){ $arr = explode(',',$new_data); $unique = array_unique($arr); $new_data = $unique; } WPSM_clean_metabox($box); // Save or update if ($current_data) { if (is_null($new_data)) delete_post_meta($post_id,$box); else update_post_meta($post_id,$box,$new_data); }elseif (!is_null($new_data)){ add_post_meta($post_id,$box,$new_data,TRUE); } } return $post_id; } function WPSM_clean_metabox(&$arr){ if (is_array($arr)){ foreach ($arr as $i => $v){ if (is_array($arr[$i])) { events_metabox_clean($arr[$i]); if (!count($arr[$i])) { unset($arr[$i]); } }else { if (trim($arr[$i]) == '') { unset($arr[$i]); } } } if (!count($arr)) { $arr = NULL; } } } ?>
The queries that screw things up are within the
WPSM_artists_autocomplete()
andWPSM_artists_selected()
functions.WPSM_artists_autocomplete
function WPSM_artists_autocomplete(){ global $post; global $wpdb; global $wp_query; $response = array(); $artists = $wpdb->get_results(" SELECT * FROM $wpdb->posts AS <code>post</code> WHERE post.post_status = 'publish' AND post.post_type = 'artist' "); if($artists){ foreach($artists as $poster){ setup_postdata($poster); $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()); } } wp_reset_query(); $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); echo WPSM_CACHE_URL."/data.json"; }
WPSM_artists_selected
function WPSM_artists_selected($arr){ global $wp_query; $wp_query = new WP_Query( array( 'post_type' => 'artist', 'posts_per_page' => -1 ) ); while ( $wp_query->have_posts() ) : $wp_query->the_post(); if(in_array(get_the_ID(),$arr)){ echo "t4.add('".get_the_title()."','".get_the_ID()."');"; } endwhile; wp_reset_query(); }
Is this a scope issue? When i use a function_exsists on the wp_reset_query() it turns out true.
I hope you guys can help cause i’m really stuck here.
Thanks!Cheers,
R.
- The topic ‘Reset the query within plugin’ is closed to new replies.