Wordpress query custom meta key - wordpress

I've added a postmeta (popular_posts) see image below. But when I query posts with meta key "popular_posts" like in below I've had no result:
new WP_Query(array( 'meta_key'=>'popular_posts' ))
Some one can explain me how to properly retrieve that have meta key "popular_posts" ?

This is the simple way to get post by their meta.
$myquery = new WP_Query( "post_type=post&meta_key=popular_posts");
Or You can use this :
$second_loop = get_posts( array(
'meta_key' => 'popular_posts',
'meta_value !=' => '',
) );

$popular_posts_args = array(
'post_type' => 'post',
'orderby' => 'meta_value',
'order' => 'DESC',
'meta_query' => array(
'meta_value' => array(
'key' => 'popular_posts',
'type' => 'NUMERIC'
)));
$popular_posts = new WP_Query($popular_posts_args);
As your meta key store numeric value. It is better to define the type in the argument. Then you can loop through $popular_posts

Related

WordPress: WP_Query with posts from a category and meta_query or only another meta_query

I have some trouble with WordPress and the WP_Query.
I would like to get posts filtered by meta_query and/or category, but I have the following problem:
The first type of posts has a custom field named "type" which must be filled with "exercise" and the post has to be in a category named "Level" (this will be set before).
The second type of posts has only the custom field named "type" which must be filled with "test".
I don't know how to get these two conditions together.
Because of that I've tried to split it into two Queries, and merge it afterward, like this:
$firstArgs = array(
'posts_per_page'=> -1,
'category_name' => $level,
'meta_key' => 'duration',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_query' => array(
'key' => 'type',
'value' => 'exercise'
)
);
$secondArgs = array(
'posts_per_page' => -1,
'meta_key' => 'duration',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_query' => array(
'key' => 'type',
'value' => 'test'
)
);
$first_query = new WP_Query( $firstArgs );
$second_query = new WP_Query( $secondArgs );
$result = new WP_Query();
$result->posts = array_merge($first_query->posts, $second_query->posts);
The Problem with this method is, that I would like to sort the posts by the custom field "duration" DESC. If I merge these two arrays, the sorting isn't that way I would like to.
Does anyone know a better way of doing this? If it would be one query, the sorting would work and I think it is more efficient.
Thanks for your help!
$firstArgs = array(
'posts_per_page'=> -1,
'category_name' => $level,
'meta_key' => 'duration',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_query' => array(
'key' => 'type',
'value' => 'exercise'
)
);
$secondArgs = array(
'posts_per_page' => -1,
'meta_key' => 'duration',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_query' => array(
'key' => 'type',
'value' => 'test'
)
);
$firstArgs = get_posts($firstArgs);
$secondArgs = get_posts($secondArgs);
$your_posts = array_unique(array_merge($firstArgs,$secondArgs),SORT_REGULAR);
_e('<pre>');
print_r($your_posts);
_e('</pre>');
For your better understanding visit here
I found an answer that worked for me.
First of all, I retrieve the data as Dhruv told me and then, I sorted the result with the usort-function, but with an anonymous function.
usort($your_posts, function($a, $b)
{
$val1 = get_post_meta($a->ID, 'duration', true );
$val2 = get_post_meta($b->ID, 'duration', true );
return -1*($val1 - $val2); // sort desc
});
Maybe it is not the best method, but it worked for me. :-)

Wordpress get_posts not working as expected

I'm trying to retrieve posts in Wordpress using the get_posts function, trying to filter by a custom field named cegep_region but the method is returning posts with any value in this field. My query below:
$cegep = get_posts(array(
'post_type' => 'cegep',
'orderby' => 'rand',
'posts_per_page' => -1,
'meta_query' => array(
'key' => 'cegep_region',
'value' => '386',
'compare' => '='
)
));
When I look into the database, 386 is not what there is in the meta_value.
select * from wp_postmeta where post_id=577 and meta_key='cegep_region'
What can I possibly be doing wrong?
Try without using compare and add one more array inside in meta_query
$args = array(
post_type' => 'cegep',
'meta_query' => array(
array(
'key' => 'cegep_region',
'value' => 386,
)
)
);
$postslist = get_posts( $args );
its work fine with me

Sort posts by custom field number

I'm using this query do get some posts.
$args = array(
'post_type' => 'spaces',
'post_per_page' => '500',
'orderby' => 'rand',
'meta_key' => 'space-city',
'meta_value' => $search,
);
$query = new WP_query($args);
Now I need to order the results by total of comments on each post. I've a custom field with this number called "space-comments", but I've no idea how to sort this posts with this second meta_key.
I made some tests, but I only was able to get post when "space-comments" has a value. When there is no value, the post don't show up.
Any ideia how can I start?
The WP_Query can accept a meta_query argument that is populated as an array of sub-arguments. That array can have sub arrays that are each their own meta query, so you can create some nice compound searches across meta data.
See the example from https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters below.
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE',
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
);
$query = new WP_Query( $args );

Wordpress output links to previous and next posts from custom query

I'm using the advanced custom fields plugin for wordpress to create a group of custom post types that have a date set within them.
I'm trying to show the previous post, and the next post, based on the date stored in the custom field. The links need to link to posts that have a date set in the future (so don't show links to posts with dates that have gone by)/
I can get a list of all the posts that are in the future, and out put these using the following code;
<?php
$rightnow = current_time('Ymd');
$args = array(
'post_type' => 'Courses',
'posts_per_page' => '25',
'meta_query' => array(
array(
'key' => 'date_of_the_course_single_day',
'compare' => '>=',
'value' => $rightnow,
)
),
'meta_key' => 'date_of_the_course_single_day',
'orderby' => 'meta_value',
'order' => 'ASC',
'post_status' => 'publish'
);
$posts = get_posts($args);
foreach ( $posts as $post ) {
?>
Output details of post here....
<?php
}
?>
What I thought I could do, is the get the current post's position in the array, to then get details of the posts one before and one after... but I haven't got a clue how to do this.
I've experimented with the wordpress next_post_link and previous_post_link functions, but these seem to work based on when the post was added to wordpress, rather than based on my custom date field.
Am I going about this the complete wrong way? Any tips or pointers would be much appreciated!
Use WP_Query plus paginate_links
$rightnow = current_time('Ymd');
// Query Args
$args = array(
'post_type' => 'Courses',
'posts_per_page' => '25',
'meta_query' => array( array(
'key' => 'date_of_the_course_single_day',
'compare' => '>=',
'value' => $rightnow,
) ),
'meta_key' => 'date_of_the_course_single_day',
'orderby' => 'meta_value',
'order' => 'ASC',
'post_status' => 'publish'
);
$query = new WP_QUery( $arg );
$posts = $query->get_posts();
// Paginate Args
$page_args = array(
'base' => 'your_custom_page_url'.'%_%', // Make sure you got this current depending on your setup
'format' => '/%#%', // requires pretty permalinks
'total' => $query->max_num_pages,
'current' => 0,
'prev_text' => __('«'),
'next_text' => __('»'),
);
foreach ( $posts as $post ) {
// Output
}
echo paginate_links( $page_args );
You have to verify that the base and format of paginate args are correct of it won't properly worked.

How to sort multiple wordpress custom field values?

Display posts with 'Product' type ordered by 'Price' custom field:
$query = new WP_Query(
array ( 'post_type' => 'product',
'orderby' => 'meta_value',
'meta_key' => 'price' )
);
Which code should I use if also want to order by 'Size'?
Another example on which I need multiple sort on custom fields:
Display posts with 'Event' type ordered by 'Start_Hour' and then by 'Start_Minute'.
Thanks to Bainternet I found the solution:
function orderbyreplace($orderby) {
return str_replace('menu_order', 'mt1.meta_value, mt2.meta_value', $orderby);
}
and...
$args = array(
'post_type'=>'Events',
'orderby' => 'menu_order',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'Start_Hour',
'value' => '',
'compare' => 'LIKE'
),
array(
'key' => 'Start_Minute',
'value' => '',
'compare' => 'LIKE'
)
)
);
add_filter('posts_orderby','orderbyreplace');
$loop = new WP_Query( $args );
remove_filter('posts_orderby','orderbyreplace');
I think this changed slightly in Wordpress 3.7.
I had to change
return str_replace('menu_order', 'mt2.meta_value, mt1.meta_value', $orderby);
into
return str_replace('wp_posts.menu_order', 'mt2.meta_value, mt1.meta_value', $orderby);
Thanks for the initial solution! [Edited]
Here's an example of using more than one meta_key and orderby that I believe should work:
$params = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'price',
'value' => '',
'compare' => 'LIKE'
),
array(
'key' => 'size',
'value' => '',
'compare' => 'LIKE'
)
),
'orderby' => 'price size',
'order' => 'ASC'
);
$query = new WP_Query;
$resulting_obj = $query->query($params);
You'll need to play with the meta_query items a bit more, especially the 'value' parameter. Please have a good look at http://codex.wordpress.org/Class_Reference/WP_Query in the 'Custom Field Parameters' section.
You don't need any filter or hooks to sort multiple custom fields, if your one of custom field is meta_key and other one is normal column of table, than use these parameters/arguments in your query.
'meta_key' => 'KEY_NAME',
'orderby' => 'meta_value_num SECOND_COLUMN_NAME',
'order' => 'ASC' or 'order' => 'DESC'
Here the order of meta_value_num and SECOND_COLUMN_NAME matter, you may see different-2 result based on the order.

Resources