Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

What I want: the array of posts returned by creating $query = new WP_Query($args);

Why: to return specific content as a sort of API request in json format, ready to display on another site


What I tried first:

foreach($query->posts as $post) {
    $post->post_content = apply_filters('the_content', $post->post_content);
};

This performed the autop and do_shortcode filters correctly, but no the oembed transformation.


What I ended up doing:

while($query->have_posts()) : $query->the_post();
    $query->posts[$query->current_post]->post_content = apply_filters('the_content', get_the_content());
endwhile;

The only difference in output, is that inside the loop it performs the oembed, outside it does not. Where does this difference come from, and is there a better way I should have done this?

I checked global $wp_filters and oembed is definitely listed under [8], so it wasn't a filter loading issue.

share|improve this question
add comment

1 Answer

up vote 0 down vote accepted

There is a difference because you are not using the_post function in the first example. What this function does is it calls setup_postdata function, which sets up all the globals needed for other functions to work. You can call it manually, just at the beginning of your foreach loop, like this: setup_postdata( $post ). In addition it is possible that you would also need to call a global $post; before your foreach loop.

share|improve this answer
    
$wp_filters is already a global variable. How does setting up global post data affect $var = apply_filters('filter_name', $value);? –  Rumpled Jan 12 '13 at 2:25
    
Well, the filter is loaded, but you don't know what exactly happens inside the filter. I have checked the WP_Embed class and it actually uses get_post function in numerous places. Now, if you check get_post function you will learn that it relies on global $post variable, which you haven't specified. The global $post is set during the_post function. –  Mateusz Hajdziony Jan 12 '13 at 3:21
    
BTW, I haven't checked you code in action but just try to call global $post; before your foreach loop (or place the_post(); at the beginning) and see if I am right. –  Mateusz Hajdziony Jan 12 '13 at 3:25
    
Didn't test it fully, but it appears that you are right. I don't understand why a function given a filter name and string as args can't apply the filters in the global wp_filter. Iw guess that's because wordpress is still in transition to oo, so global references still matter. sigh I ended up having to declare global $more inside the loop to display full articles anyway. get_the_content only allows overriding of 'More...' text, but not wether to display it or not. –  Rumpled Jan 16 '13 at 5:17
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.