本文整理汇总了PHP中WC_Subscriptions_Order::get_items_product_id方法的典型用法代码示例。如果您正苦于以下问题:PHP WC_Subscriptions_Order::get_items_product_id方法的具体用法?PHP WC_Subscriptions_Order::get_items_product_id怎么用?PHP WC_Subscriptions_Order::get_items_product_id使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类WC_Subscriptions_Order
的用法示例。
在下文中一共展示了WC_Subscriptions_Order::get_items_product_id方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。
示例1: wcs_get_old_subscription_key
/**
* Get the string key for a subscription used in Subscriptions prior to 2.0.
*
* Previously, a subscription key was made up of the ID of the order used to purchase the subscription, and
* the product to which the subscription relates; however, in Subscriptions 2.0, subscriptions can actually
* relate to multiple products (because they can contain multiple line items) and they also no longer need
* to have an original order associated with them, to make manually adding subscriptions more accurate.
*
* Therefore, although the return value of this method is a string matching the key form used inSubscriptions
* prior to 2.0, the actual value represented is not a perfect analogue. Specifically,
* - if the subscription contains more than one product, only the ID of the first line item will be used in the ID
* - if the subscription does not contain any products, the key still be missing that component of the
* - if the subscription does not have an initial order, then the order ID used will be the WC_Subscription object's ID
*
* @param WC_Subscription $subscription An instance of WC_Subscription
* @return string $subscription_key A subscription key in the deprecated form previously created by @see self::get_subscription_key()
* @since 2.0
*/
function wcs_get_old_subscription_key(WC_Subscription $subscription)
{
// Get an ID to use as the order ID
$order_id = isset($subscription->order->id) ? $subscription->order->id : $subscription->id;
// Get an ID to use as the product ID
$subscription_items = $subscription->get_items();
$first_item = reset($subscription_items);
return $order_id . '_' . WC_Subscriptions_Order::get_items_product_id($first_item);
}
示例2: filter_woocommerce_my_account_my_orders_actions
/**
* Customise which actions are shown against a subscriptions order on the My Account page.
*
* @since 1.3
*/
public static function filter_woocommerce_my_account_my_orders_actions($actions, $order)
{
if (WC_Subscriptions_Order::order_contains_subscription($order) || WC_Subscriptions_Renewal_Order::is_renewal($order)) {
unset($actions['cancel']);
if (is_numeric(get_post_meta($order->id, '_failed_order_replaced_by', true))) {
unset($actions['pay']);
}
$original_order = WC_Subscriptions_Renewal_Order::get_parent_order($order);
$order_items = WC_Subscriptions_Order::get_recurring_items($original_order);
$first_order_item = reset($order_items);
$product_id = WC_Subscriptions_Order::get_items_product_id($first_order_item);
$subscription_key = WC_Subscriptions_Manager::get_subscription_key($original_order->id, $product_id);
$subscription = WC_Subscriptions_Manager::get_users_subscription($original_order->customer_user, $subscription_key);
if (empty($subscription) || !in_array($subscription['status'], array('on-hold', 'pending'))) {
unset($actions['pay']);
}
}
return $actions;
}
示例3: get_subscription_key
/**
* Returns the string key for a subscription purchased in an order specified by $order_id
*
* @param order_id int The ID of the order in which the subscription was purchased.
* @param product_id int The ID of the subscription product.
* @return string The key representing the given subscription.
* @since 1.0
*/
public static function get_subscription_key($order_id, $product_id = '')
{
// If we have a child renewal order, we need the parent order's ID
if (WC_Subscriptions_Renewal_Order::is_renewal($order_id, array('order_role' => 'child'))) {
$order_id = WC_Subscriptions_Renewal_Order::get_parent_order_id($order_id);
}
if (empty($product_id)) {
$order = new WC_Order($order_id);
$order_items = WC_Subscriptions_Order::get_recurring_items($order);
$first_order_item = reset($order_items);
$product_id = WC_Subscriptions_Order::get_items_product_id($first_order_item);
}
$subscription_key = $order_id . '_' . $product_id;
return apply_filters('woocommerce_subscription_key', $subscription_key, $order_id, $product_id);
}
示例4: get_subscription_key
/**
* Returns the string key for a subscription purchased in an order specified by $order_id
*
* @param order_id int The ID of the order in which the subscription was purchased.
* @param product_id int The ID of the subscription product.
* @return string The key representing the given subscription.
* @since 1.0
*/
public static function get_subscription_key($order_id, $product_id = '')
{
_deprecated_function(__METHOD__, '2.0', 'wcs_get_old_subscription_key( WC_Subscription $subscription )');
// If we have a child renewal order, we need the parent order's ID
if (wcs_order_contains_renewal($order_id)) {
$order_id = WC_Subscriptions_Renewal_Order::get_parent_order_id($order_id);
}
// Get the ID of the first order item in a subscription created by this order
if (empty($product_id)) {
$subscriptions = wcs_get_subscriptions_for_order($order_id, array('order_type' => 'parent'));
foreach ($subscriptions as $subscription) {
$subscription_items = $subscription->get_items();
if (!empty($subscription_items)) {
break;
}
}
if (!empty($subscription_items)) {
$first_item = reset($subscription_items);
$product_id = WC_Subscriptions_Order::get_items_product_id($first_item);
} else {
$product_id = '';
}
}
$subscription_key = $order_id . '_' . $product_id;
return apply_filters('woocommerce_subscription_key', $subscription_key, $order_id, $product_id);
}
示例5: before_woocommerce_pay
/**
* Check if a payment is being made on a failed renewal order from 'My Account'. If so,
* redirect the order into a cart/checkout payment flow.
*
* @since 1.3
*/
public static function before_woocommerce_pay()
{
global $woocommerce;
if (isset($_GET['pay_for_order']) && isset($_GET['order']) && isset($_GET['order_id'])) {
// Pay for existing order
$order_key = urldecode($_GET['order']);
$order_id = absint($_GET['order_id']);
$order = new WC_Order($order_id);
$failed_order_replaced_by = get_post_meta($order_id, '_failed_order_replaced_by', true);
if (is_numeric($failed_order_replaced_by)) {
$woocommerce->add_error(sprintf(__('Sorry, this failed order has already been paid. See order %s.', WC_Subscriptions::$text_domain), $failed_order_replaced_by));
wp_safe_redirect(get_permalink(woocommerce_get_page_id('myaccount')));
exit;
}
if ($order->id == $order_id && $order->order_key == $order_key && in_array($order->status, array('pending', 'failed')) && WC_Subscriptions_Renewal_Order::is_renewal($order)) {
// If order being paid is a parent order, get the original order, else query parent_order
if (WC_Subscriptions_Renewal_Order::is_renewal($order_id, array('order_role' => 'parent'))) {
$role = 'parent';
$original_order = new WC_Order($order->order_custom_fields['_original_order'][0]);
} elseif (WC_Subscriptions_Renewal_Order::is_renewal($order_id, array('order_role' => 'child'))) {
$role = 'child';
$original_order = WC_Subscriptions_Renewal_Order::get_parent_order($order_id);
}
$order_items = WC_Subscriptions_Order::get_recurring_items($original_order);
$first_order_item = reset($order_items);
$product_id = WC_Subscriptions_Order::get_items_product_id($first_order_item);
$product = get_product($product_id);
// Make sure we don't actually need the variation ID
if ($product->is_type(array('variable-subscription'))) {
$item = WC_Subscriptions_Order::get_item_by_product_id($original_order, $product_id);
$variation_id = $item['variation_id'];
$variation = get_product($variation_id);
$variation_data = $variation->get_variation_attributes();
} elseif ($product->is_type(array('subscription_variation'))) {
// Handle existing renewal orders incorrectly using variation_id as the product_id
$product_id = $product->id;
$variation_id = $product->get_variation_id();
$variation_data = $product->get_variation_attributes();
} else {
$variation_id = '';
$variation_data = array();
}
$woocommerce->cart->empty_cart(true);
$woocommerce->cart->add_to_cart($product_id, 1, $variation_id, $variation_data, array('subscription_renewal' => array('original_order' => $original_order->id, 'failed_order' => $order_id, 'role' => $role)));
wp_safe_redirect($woocommerce->cart->get_checkout_url());
exit;
}
}
}
示例6: process_paypal_ipn_request
/**
* When a PayPal IPN messaged is received for a subscription transaction,
* check the transaction details and
*
* @since 1.0
*/
public static function process_paypal_ipn_request($transaction_details)
{
global $wpdb;
$transaction_details = stripslashes_deep($transaction_details);
if (!in_array($transaction_details['txn_type'], array('subscr_signup', 'subscr_payment', 'subscr_cancel', 'subscr_eot', 'subscr_failed', 'subscr_modify'))) {
return;
}
if (empty($transaction_details['custom']) || empty($transaction_details['invoice'])) {
return;
}
// Get the $order_id & $order_key with backward compatibility
extract(self::get_order_id_and_key($transaction_details));
$transaction_details['txn_type'] = strtolower($transaction_details['txn_type']);
if (self::$debug) {
self::$log->add('paypal', 'Subscription Transaction Type: ' . $transaction_details['txn_type']);
}
if (self::$debug) {
self::$log->add('paypal', 'Subscription transaction details: ' . print_r($transaction_details, true));
}
$order = new WC_Order($order_id);
// We have an invalid $order_id, probably because invoice_prefix has changed since the subscription was first created, so get the order by order key
if (!isset($order->id)) {
$order_id = function_exists('woocommerce_get_order_id_by_order_key') ? woocommerce_get_order_id_by_order_key($order_key) : $wpdb->get_var("SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = '_order_key' AND meta_value = '{$order_key}'");
$order = new WC_Order($order_id);
}
if ($order->order_key !== $order_key) {
if (self::$debug) {
self::$log->add('paypal', 'Subscription IPN Error: Order Key does not match invoice.');
}
return;
}
if ('paypal' != $order->recurring_payment_method) {
if (self::$debug) {
self::$log->add('paypal', 'IPN ignored, recurring payment method has changed.');
}
return;
}
if (isset($transaction_details['ipn_track_id'])) {
// Make sure the IPN request has not already been handled
$handled_ipn_requests = get_post_meta($order_id, '_paypal_ipn_tracking_ids', true);
if (empty($handled_ipn_requests)) {
$handled_ipn_requests = array();
}
// The 'ipn_track_id' is not a unique ID and is shared between different transaction types, so create a unique ID by prepending the transaction type
$transaction_id = $transaction_details['txn_type'] . '_' . $transaction_details['ipn_track_id'];
if (in_array($transaction_id, $handled_ipn_requests)) {
if (self::$debug) {
self::$log->add('paypal', 'Subscription IPN Error: This IPN message has already been correctly handled.');
}
return;
}
}
if (isset($transaction_details['subscr_id'])) {
update_post_meta($order_id, 'PayPal Subscriber ID', $transaction_details['subscr_id']);
}
// Get the subscription this IPN message relates to
$subscriptions_in_order = WC_Subscriptions_Order::get_recurring_items($order);
$subscription_item = array_pop($subscriptions_in_order);
$subscription_key = WC_Subscriptions_Manager::get_subscription_key($order->id, WC_Subscriptions_Order::get_items_product_id($subscription_item));
$subscription = WC_Subscriptions_Manager::get_subscription($subscription_key);
$is_first_payment = empty($subscription['completed_payments']) ? true : false;
if ('switched' === $subscription['status']) {
if (self::$debug) {
self::$log->add('paypal', 'IPN ignored, subscription has been switched.');
}
return;
}
switch ($transaction_details['txn_type']) {
case 'subscr_signup':
// Store PayPal Details
update_post_meta($order_id, 'Payer PayPal address', $transaction_details['payer_email']);
update_post_meta($order_id, 'Payer PayPal first name', $transaction_details['first_name']);
update_post_meta($order_id, 'Payer PayPal last name', $transaction_details['last_name']);
$default_invoice_string = self::$paypal_settings['invoice_prefix'] . ltrim($order->get_order_number(), '#');
// If the invoice ID doesn't match the default invoice ID and contains the string '-wcscpm-', the IPN is for a subscription payment method change
if ($default_invoice_string != $transaction_details['invoice'] && false !== strpos($transaction_details['invoice'], '-wcscpm-')) {
$is_payment_change = true;
} else {
$is_payment_change = false;
}
$switched_subscription_key = get_post_meta($order_id, '_switched_subscription_key', true);
$no_initial_payment = 0 == WC_Subscriptions_Order::get_total_initial_payment($order) && WC_Subscriptions_Order::get_subscription_trial_length($order) > 0 ? true : false;
// When there is a free trial & no initial payment amount, we need to mark the order as paid and activate the subscription
if (!$is_payment_change && (!empty($switched_subscription_key) || $no_initial_payment)) {
$order->payment_complete();
WC_Subscriptions_Manager::activate_subscriptions_for_order($order);
}
// Payment completed
if ($is_payment_change) {
$order->add_order_note(__('IPN subscription payment method changed.', WC_Subscriptions::$text_domain));
} else {
$order->add_order_note(__('IPN subscription sign up completed.', WC_Subscriptions::$text_domain));
}
if (self::$debug) {
//.........这里部分代码省略.........
示例7: payment_failed_for_order
/**
* Send an email notification when a subscription payment fails
* @param WC_Order $order
*/
public function payment_failed_for_order($order)
{
if (1 == get_option('fue_subscription_failure_notification', 0)) {
// notification enabled
$emails_string = get_option('fue_subscription_failure_notification_emails', '');
if (empty($emails_string)) {
return;
}
// get the product id to get the subscription string
$order_items = WC_Subscriptions_Order::get_recurring_items($order);
$first_order_item = reset($order_items);
$product_id = WC_Subscriptions_Order::get_items_product_id($first_order_item);
$subs_key = WC_Subscriptions_Manager::get_subscription_key($order->id, $product_id);
$subject = sprintf(__('Subscription payment failed for Order %s'), $order->get_order_number());
$message = sprintf(__('A subscription payment for the order %s has failed. The subscription has now been automatically put on hold.'), $order->get_order_number());
$recipients = array();
if (strpos($emails_string, ',') !== false) {
$recipients = array_map('trim', explode(',', $emails_string));
} else {
$recipients = array($emails_string);
}
$scheduler = Follow_Up_Emails::instance()->scheduler;
// FUE will use the billing_email by default. Remove the hook to stop it from changing the email
remove_filter('fue_insert_email_order', array($scheduler, 'get_correct_email'));
foreach ($recipients as $email) {
$scheduler->queue_email(array('user_email' => $email, 'meta' => array('subscription_notification' => true, 'email' => $email, 'subject' => $subject, 'message' => $message), 'email_trigger' => 'After a subscription payment fails', 'order_id' => $order->id, 'product_id' => $product_id, 'send_on' => current_time('timestamp')), null, true);
}
}
}
示例8: process_paypal_ipn_request
/**
* When a PayPal IPN messaged is received for a subscription transaction,
* check the transaction details and
*
* @since 1.0
*/
public static function process_paypal_ipn_request($transaction_details)
{
global $wpdb;
$transaction_details = stripslashes_deep($transaction_details);
if (!in_array($transaction_details['txn_type'], array('subscr_signup', 'subscr_payment', 'subscr_cancel', 'subscr_eot', 'subscr_failed', 'subscr_modify'))) {
return;
}
// Get the $order_id & $order_key with backward compatibility
extract(self::get_order_id_and_key($transaction_details));
$transaction_details['txn_type'] = strtolower($transaction_details['txn_type']);
if (self::$debug) {
self::$log->add('paypal', 'Subscription Transaction Type: ' . $transaction_details['txn_type']);
}
if (self::$debug) {
self::$log->add('paypal', 'Subscription transaction details: ' . print_r($transaction_details, true));
}
$order = new WC_Order($order_id);
// We have an invalid $order_id, probably because invoice_prefix has changed since the subscription was first created, so get the order by order key
if (!isset($order->id)) {
$order_id = function_exists('woocommerce_get_order_id_by_order_key') ? woocommerce_get_order_id_by_order_key($order_key) : $wpdb->get_var("SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = '_order_key' AND meta_value = '{$order_key}'");
$order = new WC_Order($order_id);
}
if ($order->order_key !== $order_key) {
if (self::$debug) {
self::$log->add('paypal', 'Subscription IPN Error: Order Key does not match invoice.');
}
exit;
}
if ('paypal' != $order->recurring_payment_method) {
if (self::$debug) {
self::$log->add('paypal', 'IPN ignored, recurring payment method has changed.');
}
exit;
}
if (isset($transaction_details['ipn_track_id'])) {
// Make sure the IPN request has not already been handled
$handled_ipn_requests = get_post_meta($order_id, '_paypal_ipn_tracking_ids', true);
if (empty($handled_ipn_requests)) {
$handled_ipn_requests = array();
}
// The 'ipn_track_id' is not a unique ID and is shared between different transaction types, so create a unique ID by prepending the transaction type
$ipn_id = $transaction_details['txn_type'] . '_' . $transaction_details['ipn_track_id'];
if (in_array($ipn_id, $handled_ipn_requests)) {
if (self::$debug) {
self::$log->add('paypal', 'Subscription IPN Error: This IPN message has already been correctly handled.');
}
exit;
}
}
if (isset($transaction_details['txn_id'])) {
// Make sure the IPN request has not already been handled
$handled_transactions = get_post_meta($order_id, '_paypal_transaction_ids', true);
if (empty($handled_transactions)) {
$handled_transactions = array();
}
$transaction_id = $transaction_details['txn_id'];
if (isset($transaction_details['txn_type'])) {
$transaction_id .= '_' . $transaction_details['txn_type'];
}
// The same transaction ID is used for different payment statuses, so make sure we handle it only once. See: http://stackoverflow.com/questions/9240235/paypal-ipn-unique-identifier
if (isset($transaction_details['payment_status'])) {
$transaction_id .= '_' . $transaction_details['payment_status'];
}
if (in_array($transaction_id, $handled_transactions)) {
if (self::$debug) {
self::$log->add('paypal', 'Subscription IPN Error: This transaction has already been correctly handled.');
}
exit;
}
}
// Save the profile ID if it's not a cancellation/expiration request
if (isset($transaction_details['subscr_id']) && !in_array($transaction_details['txn_type'], array('subscr_cancel', 'subscr_eot'))) {
update_post_meta($order_id, 'PayPal Subscriber ID', $transaction_details['subscr_id']);
}
// Get the subscription this IPN message relates to
$subscriptions_in_order = WC_Subscriptions_Order::get_recurring_items($order);
$subscription_item = array_pop($subscriptions_in_order);
$product_id = WC_Subscriptions_Order::get_items_product_id($subscription_item);
$subscription_key = WC_Subscriptions_Manager::get_subscription_key($order->id, $product_id);
$subscription = WC_Subscriptions_Manager::get_subscription($subscription_key);
$is_first_payment = empty($subscription['completed_payments']) ? true : false;
if ('switched' === $subscription['status']) {
if (self::$debug) {
self::$log->add('paypal', 'IPN ignored, subscription has been switched.');
}
exit;
}
switch ($transaction_details['txn_type']) {
case 'subscr_signup':
// Store PayPal Details
update_post_meta($order_id, 'Payer PayPal address', $transaction_details['payer_email']);
update_post_meta($order_id, 'Payer PayPal first name', $transaction_details['first_name']);
update_post_meta($order_id, 'Payer PayPal last name', $transaction_details['last_name']);
$default_invoice_string = self::$paypal_settings['invoice_prefix'] . ltrim($order->get_order_number(), '#');
//.........这里部分代码省略.........
开发者ID:jgabrielfreitas,项目名称:MultipagosTestesAPP,代码行数:101,代码来源:gateway-paypal-standard-subscriptions.php
示例9: before_woocommerce_pay
/**
* Check if a payment is being made on a failed renewal order from 'My Account'. If so,
* redirect the order into a cart/checkout payment flow.
*
* @since 1.3
*/
public static function before_woocommerce_pay()
{
global $woocommerce, $wp;
if (isset($_GET['pay_for_order']) && (isset($_GET['order']) && isset($_GET['order_id']) || isset($_GET['key']) && isset($wp->query_vars['order-pay']))) {
// Pay for existing order
$order_key = isset($_GET['key']) ? $_GET['key'] : $_GET['order'];
// WC 2.1 compatibility
$order_id = isset($wp->query_vars['order-pay']) ? $wp->query_vars['order-pay'] : absint($_GET['order_id']);
$order = new WC_Order($order_id);
$failed_order_replaced_by = get_post_meta($order_id, '_failed_order_replaced_by', true);
if (is_numeric($failed_order_replaced_by)) {
WC_Subscriptions::add_notice(sprintf(__('Sorry, this failed order has already been paid. See order %s.', 'woocommerce-subscriptions'), $failed_order_replaced_by), 'error');
wp_safe_redirect(get_permalink(woocommerce_get_page_id('myaccount')));
exit;
}
if ($order->id == $order_id && $order->order_key == $order_key && in_array($order->status, array('pending', 'failed')) && WC_Subscriptions_Renewal_Order::is_renewal($order)) {
// If order being paid is a parent order, get the original order, else query parent_order
if (WC_Subscriptions_Renewal_Order::is_renewal($order_id, array('order_role' => 'parent'))) {
$role = 'parent';
$original_order = new WC_Order(WC_Subscriptions_Order::get_meta($order, 'original_order', false));
} elseif (WC_Subscriptions_Renewal_Order::is_renewal($order_id, array('order_role' => 'child'))) {
$role = 'child';
$original_order = WC_Subscriptions_Renewal_Order::get_parent_order($order_id);
}
$order_items = WC_Subscriptions_Order::get_recurring_items($original_order);
$first_order_item = reset($order_items);
$product_id = WC_Subscriptions_Order::get_items_product_id($first_order_item);
$product = get_product($product_id);
$variation_id = '';
$variation_data = array();
// Display error message for deleted products
if (false === $product) {
WC_Subscriptions::add_notice(self::$product_deleted_error_message, 'error');
// Make sure we don't actually need the variation ID
} elseif ($product->is_type(array('variable-subscription'))) {
$item = WC_Subscriptions_Order::get_item_by_product_id($original_order, $product_id);
$variation_id = $item['variation_id'];
$variation = get_product($variation_id);
// Display error message for deleted product variations
if (false === $variation) {
WC_Subscriptions::add_notice(self::$product_deleted_error_message, 'error');
$variation_data = array();
} else {
$variation_data = $variation->get_variation_attributes();
}
} elseif ($product->is_type(array('subscription_variation'))) {
// Handle existing renewal orders incorrectly using variation_id as the product_id
$product_id = $product->id;
$variation_id = $product->get_variation_id();
$variation_data = $product->get_variation_attributes();
}
$woocommerce->cart->empty_cart(true);
$woocommerce->cart->add_to_cart($product_id, 1, $variation_id, $variation_data, array('subscription_renewal' => array('original_order' => $original_order->id, 'failed_order' => $order_id, 'role' => $role)));
wp_safe_redirect($woocommerce->cart->get_checkout_url());
exit;
}
}
}
开发者ID:jgabrielfreitas,项目名称:MultipagosTestesAPP,代码行数:64,代码来源:class-wc-subscriptions-renewal-order.php
示例10: payment_failed_for_order
/**
* @param WC_Order $order
*/
public function payment_failed_for_order($order)
{
if (1 == get_option('fue_subscription_failure_notification', 0)) {
// notification enabled
$emails_string = get_option('fue_subscription_failure_notification_emails', '');
if (empty($emails_string)) {
return;
}
// get the product id to get the subscription string
$order_items = WC_Subscriptions_Order::get_recurring_items($order);
$first_order_item = reset($order_items);
$product_id = WC_Subscriptions_Order::get_items_product_id($first_order_item);
$subs_key = WC_Subscriptions_Manager::get_subscription_key($order->id, $product_id);
$subject = sprintf(__('Subscription payment failed for Order %s'), $order->get_order_number());
$message = sprintf(__('A subscription payment for the order %s has failed. The subscription has now been automatically put on hold.'), $order->get_order_number());
$recipients = array();
if (strpos($emails_string, ',') !== false) {
$recipients = array_map('trim', explode(',', $emails_string));
} else {
$recipients = array($emails_string);
}
foreach ($recipients as $email) {
FUE::mail($email, $subject, $message);
}
}
}
示例11: upgrade_database_to_1_2
/**
* Version 1.2 introduced a massive change to the order meta data schema. This function goes
* through and upgrades the existing data on all orders to the new schema.
*
* The upgrade process is timeout safe as it keeps a record of the orders upgraded and only
* deletes this record once all orders have been upgraded successfully. If operating on a huge
* number of orders and the upgrade process times out, only the orders not already upgraded
* will be upgraded in future requests that trigger this function.
*
* @since 1.2
*/
private static function upgrade_database_to_1_2()
{
global $wpdb;
set_transient('wc_subscriptions_is_upgrading', 'true', 60 * 2);
// Get IDs only and use a direct DB query for efficiency
$orders_to_upgrade = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_parent = 0");
$upgraded_orders = get_option('wcs_1_2_upgraded_order_ids', array());
// Transition deprecated subscription status if we aren't in the middle of updating orders
if (empty($upgraded_orders)) {
$wpdb->query($wpdb->prepare("UPDATE {$wpdb->usermeta} SET meta_value = replace( meta_value, 's:9:\"suspended\"', 's:7:\"on-hold\"' ) WHERE meta_key LIKE %s", '%_' . WC_Subscriptions_Manager::$users_meta_key));
$wpdb->query($wpdb->prepare("UPDATE {$wpdb->usermeta} SET meta_value = replace( meta_value, 's:6:\"failed\"', 's:9:\"cancelled\"' ) WHERE meta_key LIKE %s", '%_' . WC_Subscriptions_Manager::$users_meta_key));
}
$orders_to_upgrade = array_diff($orders_to_upgrade, $upgraded_orders);
// Upgrade all _sign_up_{field} order meta to new order data format
foreach ($orders_to_upgrade as $order_id) {
$order = new WC_Order($order_id);
// Manually check if a product in an order is a subscription, we can't use WC_Subscriptions_Order::order_contains_subscription( $order ) because it relies on the new data structure
$contains_subscription = false;
foreach ($order->get_items() as $order_item) {
if (WC_Subscriptions_Product::is_subscription(WC_Subscriptions_Order::get_items_product_id($order_item))) {
$contains_subscription = true;
break;
}
}
if (!$contains_subscription) {
continue;
}
$trial_lengths = WC_Subscriptions_Order::get_meta($order, '_order_subscription_trial_lengths', array());
$trial_length = array_pop($trial_lengths);
$has_trial = !empty($trial_length) && $trial_length > 0 ? true : false;
$sign_up_fee_total = WC_Subscriptions_Order::get_meta($order, '_sign_up_fee_total', 0);
// Create recurring_* meta data from existing cart totals
$cart_discount = $order->get_cart_discount();
update_post_meta($order_id, '_order_recurring_discount_cart', $cart_discount);
$order_discount = $order->get_order_discount();
update_post_meta($order_id, '_order_recurring_discount_total', $order_discount);
$order_shipping_tax = get_post_meta($order_id, '_order_shipping_tax', true);
update_post_meta($order_id, '_order_recurring_shipping_tax_total', $order_shipping_tax);
$order_tax = get_post_meta($order_id, '_order_tax', true);
// $order->get_total_tax() includes shipping tax
update_post_meta($order_id, '_order_recurring_tax_total', $order_tax);
$order_total = $order->get_total();
update_post_meta($order_id, '_order_recurring_total', $order_total);
// Set order totals to include sign up fee fields, if there was a sign up fee on the order and a trial period (other wise, the recurring totals are correct)
if ($sign_up_fee_total > 0) {
// Order totals need to be changed to be equal to sign up fee totals
if ($has_trial) {
$cart_discount = WC_Subscriptions_Order::get_meta($order, '_sign_up_fee_discount_cart', 0);
$order_discount = WC_Subscriptions_Order::get_meta($order, '_sign_up_fee_discount_total', 0);
$order_tax = WC_Subscriptions_Order::get_meta($order, '_sign_up_fee_tax_total', 0);
$order_total = $sign_up_fee_total;
} else {
// No trial, sign up fees need to be added to order totals
$cart_discount += WC_Subscriptions_Order::get_meta($order, '_sign_up_fee_discount_cart', 0);
$order_discount += WC_Subscriptions_Order::get_meta($order, '_sign_up_fee_discount_total', 0);
$order_tax += WC_Subscriptions_Order::get_meta($order, '_sign_up_fee_tax_total', 0);
$order_total += $sign_up_fee_total;
}
update_post_meta($order_id, '_order_total', $order_total);
update_post_meta($order_id, '_cart_discount', $cart_discount);
update_post_meta($order_id, '_order_discount', $order_discount);
update_post_meta($order_id, '_order_tax', $order_tax);
}
// Make sure we get order taxes in WC 1.x format
if (false == self::$is_wc_version_2) {
$order_taxes = $order->get_taxes();
} else {
$order_tax_row = $wpdb->get_row($wpdb->prepare("\n\t\t\t\t\tSELECT * FROM {$wpdb->postmeta}\n\t\t\t\t\tWHERE meta_key = '_order_taxes_old'\n\t\t\t\t\tAND post_id = %s\n\t\t\t\t\t", $order_id));
$order_taxes = (array) maybe_unserialize($order_tax_row->meta_value);
}
// Set recurring taxes to order taxes, if using WC 2.0, this will be migrated to the new format in @see self::upgrade_to_latest_wc()
update_post_meta($order_id, '_order_recurring_taxes', $order_taxes);
$sign_up_fee_taxes = WC_Subscriptions_Order::get_meta($order, '_sign_up_fee_taxes', array());
// Update order taxes to include sign up fee taxes
foreach ($sign_up_fee_taxes as $index => $sign_up_tax) {
if ($has_trial && $sign_up_fee_total > 0) {
// Order taxes need to be set to the same as the sign up fee taxes
if (isset($sign_up_tax['cart_tax']) && $sign_up_tax['cart_tax'] > 0) {
$order_taxes[$index]['cart_tax'] = $sign_up_tax['cart_tax'];
}
} elseif (!$has_trial && $sign_up_fee_total > 0) {
// Sign up fee taxes need to be added to order taxes
if (isset($sign_up_tax['cart_tax']) && $sign_up_tax['cart_tax'] > 0) {
$order_taxes[$index]['cart_tax'] += $sign_up_tax['cart_tax'];
}
}
}
if (false == self::$is_wc_version_2) {
// Doing it right: updated Subs *before* updating WooCommerce, the WooCommerce updater will take care of data migration
//.........这里部分代码省略.........
示例12: get_product_id
/**
* Get the first product ID for a subscription to pass to callbacks.
*
* @since 2.0
*/
protected static function get_product_id($subscription)
{
$order_items = $subscription->get_items();
$product_id = empty($order_items) ? 0 : WC_Subscriptions_Order::get_items_product_id(reset($order_items));
return $product_id;
}
示例13: replace_variables
public function replace_variables($text, $email_order)
{
$order = new WC_Order($email_order->order_id);
$item = WC_Subscriptions_Order::get_item_by_product_id($order);
$item_id = WC_Subscriptions_Order::get_items_product_id($item);
$renewal = WC_Subscriptions_Order::get_next_payment_timestamp($order, $item_id);
$renew_date = date(get_option('date_format'), $renewal);
// calc days to renew
$now = current_time('timestamp');
$diff = $renewal - $now;
$days_to_renew = 0;
if ($diff > 0) {
$days_to_renew = floor($diff / 86400);
}
$search = array('{subs_renew_date}', '{days_to_renew}');
$replacements = array($renew_date, $days_to_renew);
return str_replace($search, $replacements, $text);
}
示例14: wpcomm_renewal_meta_update
function wpcomm_renewal_meta_update($order_meta, $order_id)
{
global $wpdb, $woocommerce;
// Send me an email if this hook works
error_log("woocommerce_subscriptions_renewal_order_created hook fired", 1, "savvywit@gmail.com", "Subject: woocommerce_subscriptions_renewal_order_created");
if (!is_object($order)) {
$order = new WC_Order($order);
}
// Get the values we need from the WC_Order object
$order_id = $order->id;
$item = $order->get_items();
$product_id = WC_Subscriptions_Order::get_items_product_id($item[0]);
// These arrays contain the details for each possible product, in order. They
// are used to change the order to the correct values
$quarterly_product_ids = array(2949, 2945, 2767, 2793, 2795, 2796, 2798, 2799, 2800, 2805, 2806, 2815, 2816, 2817);
$quarterly_product_names = array("One Day Renewal for Testing No Virtual Downloadable", "One Day Renewal for Testing", "0-3 MONTHS ELEPHANT (QUARTERLY)", "3-6 MONTHS HIPPO (QUARTERLY)", "6-9 MONTHS GIRAFFE (QUARTERLY)", "9-12 MONTHS PANDA (QUARTERLY)", "12-15 MONTHS ZEBRA (QUARTERLY)", "15-18 MONTHS RABBIT (QUARTERLY)", "18-21 MONTHS MONKEY (QUARTERLY)", "21-24 MONTHS FROG (QUARTERLY)", "24-27 MONTHS KANGAROO (QUARTERLY)", "27-30 MONTHS BEAR (QUARTERLY)", "30-33 MONTHS TIGER (QUARTERLY)", "33-36 MONTHS CROCODILE (QUARTERLY)");
// Not sure yet if SKUs are needed
$quarterly_product_skus = array("test sku one", "test sku two", "0-3-elephant-q", "3-6-hippo-q", "6-9-giraffe-q", "9-12-panda-q", "12-15-zebra-q", "15-18-rabbit-q", "18-21-monkey-q", "21-24-frog-q", "24-24-kangaroo-q", "27-30-bear-q", "30-33-tiger-q", "33-36-crocodile-q");
$yearly_product_names = array();
$yearly_product_ids = array();
// Get the position of the current id, and then assign the next product
// to $incremented_item_id and $incremented_item_name
$product_id_index = array_search($product_id, $quarterly_product_ids);
if ($product_id_index === False) {
$product_id_index = array_search($product_id, $yearly_product_ids);
}
$incremented_item_id = $quarterly_product_ids[$product_id_index + 1];
$incremented_item_name = $quarterly_product_names[$product_id_index + 1];
$incremented_item_sku = $quarterly_product_skus[$product_id_index + 1];
// Apply the updates to the order
$order_meta["_product_id"] = $incremented_item_id;
$order_meta["_product_name"] = $incremented_item_name;
$order_meta["_sku"] = $incremented_item_sku;
return $order_meta;
}