I want to get product_id (from Website A ) Woocommerce APi and create a order in website B
If from Website A product_id =11 then create product_id= 1050 in website B
If product_id =121 then create product_id= 160 in website B
function create_order_from( $customer_id, $new_customer_data, $password_generated ) {
$live_ck = 'ck_blablabla';
$live_cs = 'cs_blablabla';
$live_url = 'https://www.website.com/wp-json/wc/v3/orders?consumer_key=' . $live_ck . '&consumer_secret=' . $live_cs;
$customer = new WC_Customer( $customer_id );
$body = array(
'status' => 'completed',
'meta_data' => array( array(
'key' => 'createdby',
'value' => 'website'
)),
'total' => 0,
'billing' => array(
'first_name' => $customer->get_billing_first_name(),
'email' => $customer->get_email(),
),
'line_items' => array( array(
'product_id' => 1050,
'quantity' => 1,
)),
);
$raw_response = wp_remote_post( $live_url,
array(
'headers' => array( 'Content-Type' => 'application/json' ),
'timeout' => 30,
'body' => json_encode( $body ),
)
);
}```
THank you for your help
I have a meta_key called delivered_date, in date format, example 2021-05-13 16:01:26.
If I MUST use wc_get_orders( $args ), how can I get all orders within a date range?
Tried using the meta_compare argument but it returns nothing:
// The 2 variables below will come from a datepicker widget
$start_date = "2021-05-10 0:00:00";
$end_date = "2021-05-30 11:59:59";
$args = array(
'type' => 'shop_order',
'limit' => 100,
'paginate' => true,
'page' => 1,
'orderby' => 'id',
'order' => 'DESC',
'meta_key' => 'delivered_date',
'meta_value' => array($start_date, $end_date),
'meta_compare' => 'BETWEEN',
);
$result = wc_get_orders( $args );
You are close, use date — Format a local time/date
So you get:
// The 2 variables below will come from a datepicker widget
$start_date = date( '2021-05-10 00:00:00' );
$end_date = date( '2021-05-30 11:59:59' );
$args = array(
'orderby' => 'id',
'order' => 'DESC',
'meta_key' => 'delivered_date',
'meta_value' => array( $start_date, $end_date ),
'meta_compare' => 'BETWEEN',
);
$orders = wc_get_orders( $args );
// NOT empty
if ( ! empty ( $orders ) ) {
foreach ( $orders as $order ) {
echo '<p>ID = ' . $order->get_id() . '</p>';
}
}
Result: ID = 2525, ID = 2524, ID = 2523
I have created a WP Query argument list like so hoping it will select all posts with term 2 and then from results all others with relation OR.
$similar_properties_args = array(
'post_type' => 'property',
'posts_per_page' => '10',
'post__not_in' => array(get_post_ID() ),
'post_parent__not_in' => array(get_post_ID() ),
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'language',
'terms' => '2'
),
array (
'relation' => 'OR',
array(
array(
'taxonomy' => 'property-feature',
'field' => 'id',
'terms' => array(1954,1958,1966,1970,1972)
),
array(
'taxonomy' => 'property-city',
'field' => 'id',
'terms' => array(145)
),
array(
'taxonomy' => 'property-status',
'field' => 'id',
'terms' => array(38)
),
array(
'taxonomy' => 'property-type',
'field' => 'id',
'terms' => array(21)
)
)
)
)
);
The actual WP mysql query created is as as below:
SELECT SQL_CALC_FOUND_ROWS agn_posts.ID FROM agn_posts LEFT JOIN agn_term_relationships ON (agn_posts.ID = agn_term_relationships.object_id) LEFT JOIN agn_term_relationships AS tt1 ON (agn_posts.ID = tt1.object_id) LEFT JOIN agn_term_relationships AS tt2 ON (agn_posts.ID = tt2.object_id) LEFT JOIN agn_term_relationships AS tt3 ON (agn_posts.ID = tt3.object_id) LEFT JOIN agn_term_relationships AS tt4 ON (agn_posts.ID = tt4.object_id) WHERE 1=1 AND agn_posts.ID NOT IN (1440) AND agn_posts.post_parent NOT IN (1440) AND (
agn_term_relationships.term_taxonomy_id IN (2)
AND
(
(
tt1.term_taxonomy_id IN (1954,1958,1966,1970,1972)
AND
tt2.term_taxonomy_id IN (145)
AND
tt3.term_taxonomy_id IN (38)
AND
tt4.term_taxonomy_id IN (21)
)
)
) AND agn_posts.post_type = 'property' AND (agn_posts.post_status = 'publish' OR agn_posts.post_status = 'private') GROUP BY agn_posts.ID ORDER BY agn_posts.post_date DESC LIMIT 0, 10
...and it is not giving me the results as I would need to get.
If I change the tt1 term relationship to OR, then the result is fine.
tt1.term_taxonomy_id IN (1954,1958,1966,1970,1972)
OR //from AND to OR
tt2.term_taxonomy_id IN (145)
OR //from AND to OR
tt3.term_taxonomy_id IN (38)
OR //from AND to OR
tt4.term_taxonomy_id IN (21)
The problem Is, from my naked eye, the argument list above is valid for creating the query I am looking for, but somehow something is missing. May be you can see, where is the problem in my code?
You shouldn't nest the four arrays/clauses in an array:
'tax_query' => array(
'relation' => 'AND', // for clauses 1 and 2
array( // clause 1
'taxonomy' => 'language',
'terms' => '2',
),
array( // clause 2
'relation' => 'OR', // for sub-clause 1..
// you shouldn't nest the sub-sub-clauses
array( // sub-clause 1
array( // sub-sub-clause 1
'taxonomy' => 'property-feature',
...
),
array( // sub-sub-clause 2
'taxonomy' => 'property-city',
...
),
array( // sub-sub-clause 3
'taxonomy' => 'property-status',
...
),
array( // sub-sub-clause 4
'taxonomy' => 'property-type',
...
),
),
),
),
Instead, make the arrays same level as the relation:
'tax_query' => array(
'relation' => 'AND', // for clauses 1 and 2
array( // clause 1
'taxonomy' => 'language',
'terms' => '2',
),
array( // clause 2
'relation' => 'OR', // for the sub-clauses 1, 2, 3 and 4
// instead of nesting, do like so:
array( // sub-clause 1
'taxonomy' => 'property-feature',
'terms' => array( 1954, 1958, 1966, 1970, 1972 ),
),
array( // sub-clause 2
'taxonomy' => 'property-city',
'terms' => array( 145 ),
),
array( // sub-clause 3
'taxonomy' => 'property-status',
'terms' => array( 38 ),
),
array( // sub-clause 4
'taxonomy' => 'property-type',
'terms' => array( 21 ),
),
),
),
And that one would give you this SQL command as part of the WHERE:
agn_term_relationships.term_taxonomy_id IN (2) # language
AND
(
tt1.term_taxonomy_id IN (1954,1958,1966,1970,1972) # feature
OR
tt1.term_taxonomy_id IN (145) # city
OR
tt1.term_taxonomy_id IN (38) # status
OR
tt1.term_taxonomy_id IN (21) # type
)
And BTW, 'field' => 'id' should be 'field' => 'term_id', but the default field is indeed term_id, so you may omit the field arg. Also, WordPress does not have a function named get_post_ID, so I think you meant to use get_the_ID()? :)
I have 100 posts all have a meta_key named "isactive" whose value will either be "1" or "0"
I need to calculate the percentage of number of active posts(from 'isactive' metakey value) between any 2 dates
$args0 = array(
'date_query' => array(
array(
'after' => 'January 1st, 2013',
'before' => array(
'year' => 2013,
'month' => 2,
'day' => 28,
),
'inclusive' => true,
),
'meta_key' => 'isactive',
'meta_value' => 0
)
);
$count0 = new WP_Query( $args0 );
$args1 = array(
'date_query' => array(
array(
'after' => 'January 1st, 2013',
'before' => array(
'year' => 2013,
'month' => 2,
'day' => 28,
),
'inclusive' => true,
),
'meta_key' => 'isactive',
'meta_value' => 1
)
);
$count1 = new WP_Query( $args1 );
echo $percent = $count0/$count1;
Whether this type of query works ?
Else is there any better way to calculate percentage based on the meta key values between 2 dates?
I have "product" custom post type. It have 2 custom fields: price1, price2 (price of product)
I want to get all posts have price1 < price2 (compare 2 values)
How can i do that?
Here's a nice sample that should help you out:
$args = array(
'tax_query' => array(
'taxonomy' => 'custom_taxonomy_name',
array(
'key' => 'price',
'value' => array( 100, 200 ),
'compare' => 'BETWEEN',
'type' => 'numeric',
),
array(
'key' => 'description',
'value' => 'round',
'compare' => 'NOT LIKE'
)
)
);
$query = new WP_Query($args);