I am doing a task for event management, I have coded a widget to display Coming or Past events in sidebar, but I can not handle the custom fields as date. following is my code, while the date is being stored as "m/d/Y". Please help me to resolve this issue. Thanks in adance
$today = date('m/d/Y');
$args = array(
'post_type' => 'event',
'post_status' => 'publish',
'meta_key' => 'event_date',
'posts_per_page' => '5',
'meta_query' => array(
array(
'key' => 'event_date',
'value' => $today,
'compare' => '<=',
'type' => 'date'
)
),
'orderby' => 'meta_value_num',
'order' => 'ASC'
);
$the_query = new WP_Query( $args );
Date must be in YYYY-MM-DD format for the meta_query comparison to work
$today = date("Y-m-d");
While I agree with the previous answer (you should store dates in YYYY-MM-DD format), I thought I could find a workaround using a Wordpress filter, so here you go.
This should go into your functions.php file:
add_filter('posts_where', 'my_callback', 10, 2);
function my_callback( $where, $wp_query_obj ) {
if( isset( $wp_query_obj->query['date_format'] ) ) {
$where = preg_replace('~CAST\((.+?)\)~', "STR_TO_DATE(CAST($1), '{$wp_query_obj->query['date_format']}')", $where);
}
return $where;
}
And this is your query:
$today = date('m/d/Y');
$args = array(
'post_type' => 'event',
'posts_per_page' => '5',
'meta_key' => 'event_date',
'meta_value' => $today,
'meta_compare' => '<=',
'date_format' => '%m/%d/%Y'
'orderby' => 'meta_value_num',
'order' => 'ASC'
);
$the_query = new WP_Query( $args );
The key here is the date_format argument I added to the query: if you don't add it the filter won't be applied.
This could work with other date formats, you only need to change the date_format argument consistent with the STR_TO_DATE MySQL function parameter format.
Related
I want to order posts by price in wordpress, I tried a lot and also concerned by documentation, all looks good but still it is not working..
here is code....
global $wp_query;
$query_vars = $wp_query->query_vars;
$post_per_page = 12;
global $term;
$term = (strip_tags($_GET['term']));
if (!empty($_GET['term'])) {
add_filter('posts_where', 'taskerdev_posts_where');
}
$meta_query = array();
$closed = array(
'key' => 'closed',
'value' => "0",
'compare' => '='
);
$meta_query[] = $closed;
if (!empty($_GET['tasker_cat_cat']))
$tasker_cat = array(
'taxonomy' => 'tasker_cat',
'field' => 'slug',
'terms' => $_GET['tasker_cat_cat']);
$meta_query[] = $tasker_cat;
$price = array(
'meta_key' => 'price',
'orderby' => 'meta_value_num',
'order' => 'ASC'
);
$meta_query[] = $price;
$args = array('post_type' => 'shoping', 'posts_per_page' => 10,
'paged' => $query_vars['paged'], 'meta_query' => $meta_query);
This code looks fine, but I cant get post order by price that is in post_meta..
I can see this code to sort results every where even in documentation of wp_query.
$price = array(
'meta_key' => 'price',
'orderby' => 'meta_value_num',
'order' => 'ASC'
);
$meta_query[] = $price;
are you sure that the metafield price is numeric?
'orderby' => 'meta_value_num',
works only on numeric fields.. if a value is numeric depends on the format of price saved in your field.
maybe post a example value so that people see what the real value is
I have custom post type called "lawyer" and I want to query lawyers ordered by custom field "surname" and then ordered by custom field "name". My query looks like this:
query_posts( array ( 'post_type' => 'lawyer', 'posts_per_page' => -1, 'meta_query' => array(array('key' => 'surname', 'orderby' => 'meta_value', 'order' => ASC), array('key' => 'name', 'orderby' => 'meta_value', 'order' => ASC) )) );
But it's not working. I get results, but they are not ordered the way I want them to. Any idea what is wrong here?
Don't use query_posts() ever.
Reference When should you use WP_Query vs query_posts() vs get_posts()?
You can do it by using WP_QUERY and adding filter to posts_orderby
function custom_orderby($orderby) {
global $wpdb;
return str_replace($wpdb->prefix.'postmeta.meta_value', 'mt1.meta_value, mt2.meta_value ASC', $orderby);
}
Then Prepare your arguments.
$args = array(
'post_type'=>'lawyer',
'orderby' => 'meta_value',
'meta_key' => 'surname',
'meta_query' => array(
array(
'key' => 'surname',
'value' => '',
),
array(
'key' => 'name',
'value' => '',
)
)
);
And add your custom order by filter just before the query execute.
add_filter('posts_orderby','custom_orderby');
$loop = new WP_Query( $args );
remove_filter('posts_orderby','custom_orderby');
Finally made it work with this code:
function double_meta_posts_orderby($orderby) {
remove_filter('posts_orderby', 'double_meta_posts_orderby');
global $wpdb;
return " {$wpdb->postmeta}.meta_value, mt1.meta_value";
}
$args = array(
'post_type'=>'lawyer',
'post_per_page' => -1,
'meta_query' => array(
array(
'key' => 'surname',
),
array(
'key' => 'name',
)
),
'orderby' => 'meta_value',
'order' => ASC,
);
add_filter('posts_orderby', 'double_meta_posts_orderby');
$loop = new WP_Query( $args );
// the Loop
while ($loop->have_posts()) : $loop->the_post();
...
I have a custom content type (event), within that type I have a custom date field, with the name: 'date'. In my template I am running the WP_Query to return a list of events. I would like to only get events that are in the future (according to my custom 'date' field) and then order the list by that same field.
I have tried the following but it simply returns a list of all the 'events' in the system, regardless of date
$today = date('d M, y');
$args = array (
'post_type' => 'event',
'meta_query' => array(
array(
'key' => 'date',
'value' => $today,
'compare' => '>',
'type' => 'CHAR',
),
),
'meta_key' => 'date',
'orderby' => 'meta_value_num',
'order' => 'ASC'
);
As a note: if I replace the type from 'CHAR' to 'DATE' I get no results returned...
Try this:
functions.php
function custom_unixtimesamp ( $post_id ) {
if ( get_post_type( $post_id ) == 'events' ) {
$startdate = get_post_meta($post_id, 'event_date_begins', true);
if($startdate) {
$dateparts = explode('/', $startdate);
$newdate1 = strtotime(date('d.m.Y H:i:s', strtotime($dateparts[1].'/'.$dateparts[0].'/'.$dateparts[2])));
update_post_meta($post_id, 'unixstartdate', $newdate1 );
}
}
}
add_action( 'save_post', 'custom_unixtimesamp', 100, 2);
then query
$today = time();
$args = array(
'post_type' => 'events',
'post_status' => 'publish',
'posts_per_page' => '10',
'meta_query' => array(
array(
'key' => 'unixstartdate',
'compare' => '>=',
'value' => $today,
)
),
'meta_key' => 'event_date_begins',
'orderby' => 'meta_value',
'order' => 'ASC',
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);
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.
I am trying to get the posts order by a meta_value that i put in a sortable list of posts, i have an extra meta_key and meta_value to give extra info to the query, but i can't make the WP_Query return the post order, do you have any idea that whats is worng?
This is my WP_QUery code:
$args = array(
'meta_query' => array(
array(
'key' => 'portada',
'value' => 'on'
), array(
'key' => 'pos',
'type' => 'numeric'
)
),
'meta_key' => 'pos',
'orderby' => 'meta_value_num');
$loop = new WP_Query($args);
i use the follow code to solve my problem:
$args = array(
'meta_query' => array(
array(
'meta_key' =>'destacados',
'meta_value' => 'on'
)
),
'orderby' => 'meta_value_num',
'category__in' => $category->cat_ID,
'meta_key' => 'pos'
);
$loop = new WP_Query($args);
Thank you all :)
Note that
'meta_query' => array(
array(
'key' =>'destacados',
'value' => 'on'
)
)
instead of
'meta_query' => array(
array(
'meta_key' =>'destacados',
'meta_value' => 'on'
)
)