У меня есть сайт Woocommerce, и я использую Gravity Forms для дальнейшего расширения каждого заказа.
Я пишу инструмент управления, который использует оба API для создания статистики и другие инструменты администрирования.
Я могу получить список записей Gravity Forms, а также список заказов. У меня проблема в том, что я не знаю, как я могу получить запись, которая относится к определенному заказу.
Есть ли способ сделать это?
Вы пробовали с плагином истории woocomerce или извлекали необработанные метаданные из элемента¿?
wc_get_order_item_meta ($ order_item_id, «_gravity_forms_history»);
wc_get_order_item_meta ($ order_item_id, «_gravity_form_data»);
имейте в виду, что для этого потребуется создать новую конечную точку, а не поставить ее из коробки.
В последний раз, когда я работал с надстройками продуктов WooCommerce Gravity Forms (год или около того назад), он не сохранял идентификатор заказа в записи (это должно было произойти после создания записи и после создания заказа) или записи. Идентификатор в заказе. Последнее, вероятно, имеет больше смысла, но оба требуют специального кода.
Опять же, прошло некоторое время с тех пор, как я работал с надстройкой. Я бы пинговал поддержку WC и посмотрел, есть ли у них какие-либо советы по реализации поддержки для этого.
Вот где я нашел связь между WooCommerce и надстройкой для гравитационных форм:
В базе данных найдите порядок в таблице your_table_prefix_posts, и захватить его ID. Я фильтровал для post_type «shop_order».
В таблице your_table_prefix_woocommerce_order_items, найдите только что найденный идентификатор и отфильтруйте строку «line_item» в столбце «order_item_type», а затем выберите «order_item_id».
Используйте этот «order_item_id», чтобы найти мета порядка в таблице your_table_prefix_woocommerce_order_itemmeta.
Все данные о гравитационных формах ордена находятся там. Похоже, что нет фактической связи между тем, что делает Ву и гравитацией, за исключением того, что форма заполнена, и данные собираются и вставляются в your_table_prefix_woocommerce_order_itemmeta. Я не могу найти ничего, что связывает определенный порядок с конкретной записью gf, но вы можете получить данные из Woo и, по крайней мере, использовать их для поиска записей GF.
Я смог сделать это, используя Gravity Forms, дополнения к продуктам Gravity Forms и Woocommerce, используя три этапа:
ШАГ 1: Получить GF Entry ID / s, когда запись сделана, и сохранить ее в сеансе. Это происходит до того, как оформить заказ, а иногда до того, как пользователь вошел в систему.
add_action( 'gform_after_submission', 'blb_get_lead_entry_id', 10, 2 );
function blb_get_lead_entry_id( $entry, $form ) {
$meta_value = $entry['id'];
//session array with all the entries because GF creates 2 entries each time for validation purposes apparently
if (!isset($_SESSION['entryclump'])) {
$_SESSION['entryclump'] = array();
}
$_SESSION['entryclump'][] = $meta_value;
//also an array with just the current entry which will end up be the later of the two entries added by GF
$_SESSION[ 'gf-entry-id' ] = $meta_value;
}
ШАГ 2: Включите только что собранную вами запись ($ _SESSION [‘gf-entry-id’]) с мета корзины, а затем сохраните ее.
В этом случае я сохраняю поле с именем «_gf_entry_ID», которое будет добавлено в таблицу woocommerce_order_itemmeta с правильным значением order_item_id и последним из двух записей GF в качестве meta_value.
//add cart item data
add_filter( 'woocommerce_add_cart_item_data', 'blb_add_gfentry_to_cart_data', 10, 3 );
function blb_add_gfentry_to_cart_data( $cartItemData, $productId, $variationId ) {
$entryid=$_SESSION[ 'gf-entry-id' ];
$cartItemData['GFentryID'] = $entryid;
return $cartItemData;
unset($_SESSION[ 'gf-entry-id' ]);
}//add cart item data: session stuff
add_filter( 'woocommerce_get_cart_item_from_session', 'blb_cart_item_session', 10, 3 );
function blb_cart_item_session( $cartItemData, $cartItemSessionData, $cartItemKey ) {
if ( isset( $cartItemSessionData['GFentryID'] ) ) {
$cartItemData['GFentryID'] = $cartItemSessionData['GFentryID'];
}
return $cartItemData;
}
//save the data
add_action( 'woocommerce_add_order_item_meta', 'blb_save_gfentry', 10, 3 );
function blb_save_gfentry( $itemId, $values, $key ) {
if ( isset( $values['GFentryID'] ) ) {
wc_add_order_item_meta( $itemId, '_gf_entry_ID', $values['GFentryID'] );
}
}
ШАГ 3 (необязательно): обновите форму GF, чтобы она отображала правильный идентификатор пользователя creat_by. Теперь, когда проверка завершена и пользователь вошел в систему, мы можем это сделать.
function blb_woocommerce_thankyou( $order_id ) {
//Current User
$currentUserID = wp_get_current_user()->ID;
//GF Entry Array for Order
$order = new WC_Order( $order_id );
$items = $order->get_items();
$order_item_ids = array();
$gf_entry_ids = array();
foreach ( $items as $key=>$item ) {
$gf_entry_ids[] = $item['item_meta']['_gf_entry_ID'][0];
}
//First real quick clear all the entries in the entry clump (in case the user was already logged in)
//This is important because GF creates two forms for product add ons with Woocommerce and we only want one to show up in the list and edit plugin
$entryclump = $_SESSION[ 'entryclump' ];
foreach ( $entryclump as $entry ) {
global $wpdb;
$wpdb->update('wp_rg_lead', array('created_by' => null), array('id' => $entry));
}//Update wp_rg_lead
if (($currentUserID!=0) && (isset($_SESSION[ 'entryclump' ])) ) {
foreach ( $gf_entry_ids as $gf_entry_id ) {
global $wpdb;
$wpdb->update('wp_rg_lead', array('created_by' => $currentUserID), array('id' => $gf_entry_id));
} //foreach
} //if
unset($_SESSION[ 'entryclump' ]);};
add_action( 'woocommerce_thankyou', 'blb_woocommerce_thankyou', 10, 1 );