Как настроить платежный шлюз, изменив порядок со стороны администратора в WooCommerce
Пожалуйста помоги! Я пытаюсь определить Платежный шлюз, изменив детали заказа у администратора.
В качестве опции по умолчанию я хочу использовать платежный шлюз 'bacs'. Клиент делает заказ, а затем я хочу изменить заказ и изменить способ оплаты на собственный шлюз 'payment2'.
Для этого я сделал метабокс с флажком, который должен включать / выключать метод payment2 и сбрасывать значения по умолчанию "bacs". Флажок работает правильно.
Но я не могу заставить его работать. Прежде всего, я не могу получить метаданные поста со значением флажка. Проверьте код ниже, пожалуйста:
function show_payment2_payment_gateway( $available_gateways ) {
$use_payment2 = get_post_meta( $post->ID, 'use_payment2', true );
if($use_payment2 == "yes") {
unset( $available_gateways['bacs'] );
}
else {
unset( $available_gateways['payment2'] );
}
return $available_gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'show_payment2_payment_gateway', 10, 1 );
UPD
Это мой код для бэкэнда. Как я уже сказал, он работает хорошо и сохраняет мета-значение как "да"
//
//Adding Meta container admin shop_order pages
//
add_action( 'add_meta_boxes', 'mv_add_meta_boxes' );
if ( ! function_exists( 'mv_add_meta_boxes' ) )
{
function mv_add_meta_boxes()
{
global $woocommerce, $order, $post;
add_meta_box( 'mv_other_fields', __('PAYMENT2','woocommerce'), 'mv_add_other_fields_for_packaging', 'shop_order', 'side', 'core' );
}
}
//
//adding Meta field in the meta container admin shop_order pages
//
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{
function mv_add_other_fields_for_packaging()
{
global $woocommerce, $order, $post;
$meta_field_data = get_post_meta( $post->ID, 'use_payment2', true );
$meta_field_data_checked = $meta_field_data["use_payment2"][0];
if($meta_field_data == "yes") $meta_field_data_checked = 'checked="checked"';
echo '
<label for="use_epay">TURN PAYMENT2 ON?</label>
<input type="hidden" name="mv_other_meta_field_nonce" value="' . wp_create_nonce() . '">
<input type="checkbox" name="use_payment2" value="yes" '.$meta_field_data_checked.'>';
}
}
//
//Save the data of the Meta field
//
add_action( 'save_post', 'mv_save_wc_order_other_fields', 10, 1 );
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{
function mv_save_wc_order_other_fields( $post_id ) {
// We need to verify this with the proper authorization (security stuff).
// Check if our nonce is set.
if ( ! isset( $_POST[ 'mv_other_meta_field_nonce' ] ) ) {
return $post_id;
}
$nonce = $_REQUEST[ 'mv_other_meta_field_nonce' ];
//Verify that the nonce is valid.
if ( ! wp_verify_nonce( $nonce ) ) {
return $post_id;
}
// If this is an autosave, our form has not been submitted, so we don't want to do anything.
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return $post_id;
}
// Check the user's permissions.
if ( 'page' == $_POST[ 'post_type' ] ) {
if ( ! current_user_can( 'edit_page', $post_id ) ) {
return $post_id;
}
} else {
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return $post_id;
}
}
// --- Its safe for us to save the data ! --- //
// Sanitize user input and update the meta field in the database.
update_post_meta( $post_id, 'use_payment2', $_POST[ 'use_payment2' ] );
}
}
UPD
Это рабочий код для Back-End (настраиваемый флажок метабокса). Сохраняет значение флажка и меняет способ оплаты в деталях заказа:
//
//Adding Meta container admin shop_order pages
//
add_action( 'add_meta_boxes', 'mv_add_meta_boxes' );
if ( ! function_exists( 'mv_add_meta_boxes' ) )
{
function mv_add_meta_boxes()
{
global $woocommerce, $order, $post;
add_meta_box( 'mv_other_fields', __('PAYMENT2','woocommerce'), 'mv_add_other_fields_for_packaging', 'shop_order', 'side', 'core' );
}
}
//
//adding Meta field in the meta container admin shop_order pages
//
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{
function mv_add_other_fields_for_packaging()
{
global $woocommerce, $order, $post;
$meta_field_data = get_post_meta( $post->ID, 'use_payment2', true );
echo '<label for="use_payment2">USE PAYMENT2?</label>
<input type="hidden" name="mv_other_meta_field_nonce" value="' . wp_create_nonce() . '">';
if($meta_field_data == "yes") {
$meta_field_data_checked = 'checked="checked"';
echo'<input type="checkbox" name="use_payment2" value="yes" '.$meta_field_data_checked.'>';
}
else {
echo'<input type="checkbox" name="use_payment2" value="yes">';
}
}
}
//Save the data of the Meta field
add_action( 'save_post', 'mv_save_wc_order_other_fields', 10, 1 );
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{
function mv_save_wc_order_other_fields( $post_id ) {
// We need to verify this with the proper authorization (security stuff).
// Check if our nonce is set.
if ( ! isset( $_POST[ 'mv_other_meta_field_nonce' ] ) ) {
return $post_id;
}
$nonce = $_REQUEST[ 'mv_other_meta_field_nonce' ];
//Verify that the nonce is valid.
if ( ! wp_verify_nonce( $nonce ) ) {
return $post_id;
}
// If this is an autosave, our form has not been submitted, so we don't want to do anything.
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return $post_id;
}
// Check the user's permissions.
if ( 'page' == $_POST[ 'post_type' ] ) {
if ( ! current_user_can( 'edit_page', $post_id ) ) {
return $post_id;
}
} else {
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return $post_id;
}
}
// --- Its safe for us to save the data ! --- //
// Sanitize user input and update the meta field in the database.
$use_payment2 = sanitize_text_field($_POST[ 'use_payment2' ]);
update_post_meta( $post_id, 'use_payment2', $use_payment2 );
if($_POST[ 'use_payment2' ] == 'yes') {
update_post_meta( $post_id, '_payment_method', 'payment2' );
}
elseif (get_post_meta( $post_id, '_payment_method', true ) != 'bacs') {
update_post_meta( $post_id, '_payment_method', 'bacs' );
}
}
}
Но как я могу использовать состояние флажка на моем интерфейсе? Я все еще не могу получить значение флажка, используя этот код:
function show_payment2_payment_gateway( $available_gateways ) {
global $woocommerce, $order, $post;
$payment_method = get_post_meta( $post_id, 'use_payment2', true );
if(isset($payment_method) == 'yes') {
unset( $available_gateways['bacs'] );
}
else {
unset( $available_gateways['payment2'] );
}
return $available_gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'show_payment2_payment_gateway', 10, 1 );
Теперь всегда отображается опция Payment2, даже если флажок установлен или не установлен.
3 ответа
После нескольких дней головной боли я нашел простой способ показать определенный платежный шлюз только тогда, когда отправляю ссылку клиенту.
Теперь клиент может сделать заказ по умолчанию с помощью метода "bacs", а администратор может проверить его до оплаты. Затем администратор меняет статус заказа на Ожидание оплаты и ссылка отправляет клиенту. Когда клиент открывает ссылку, мой пользовательский платежный шлюз становится активным.
Я решил использовать конечные точки woocommerce, чтобы проверить, является ли это страницей "заказ-оплата". Я использовал код ниже:
function show_payment2_payment_gateway( $available_gateways ) {
global $woocommerce, $order, $post;
if (is_wc_endpoint_url( 'order-pay' )) {
unset( $available_gateways['bacs'] );
}
else {
unset( $available_gateways['payment2'] );
}
return $available_gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'show_payment2_payment_gateway', 10, 1 );
Теперь это работает именно так, как я хотел раньше. Я надеюсь, что это будет полезно. Спасибо @LoicTheAztec за помощь!
Обновление 2 относится к вашим комментариям (и обновлению вашего вопроса)
Используемый вами хук - это передний конец (не админ), поэтому он не будет работать.
Чтобы достичь желаемого, вам нужно заменить некоторый код внутри функции, которая собирается сохранить ваше значение пользовательского флажка, когда вы обновляете заказ на страницах заказа редактирования бэкэнда (администратора).
Итак, ваш код теперь будет выглядеть так:
add_action( 'save_post', 'mv_save_wc_order_other_fields', 10, 1 );
if ( ! function_exists( 'mv_save_wc_order_other_fields' ) )
{
function mv_save_wc_order_other_fields( $post_id ) {
// We need to verify this with the proper authorization (security stuff).
// Check if our nonce is set.
if ( ! isset( $_POST[ 'mv_other_meta_field_nonce' ] ) )
return $post_id;
// Passing the value to a variable
$nonce = $_REQUEST[ 'mv_other_meta_field_nonce' ];
// If this is an autosave, our form has not been submitted, so we don't want to do anything.
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// Check the user's permissions.
if ( 'page' == $_POST[ 'post_type' ] ) {
if ( ! current_user_can( 'edit_page', $post_id ) )
return $post_id;
} else {
if ( ! current_user_can( 'edit_post', $post_id ) )
return $post_id;
}
// --- Its safe for us to save the data ! --- //
// Sanitize user input and update the meta field in the database.
$use_payment2 = sanitize_text_field($_POST[ 'use_payment2' ]);
update_post_meta( $post_id, 'use_payment2', $use_payment2 );
// Updating securely the data with your conditions
if($use_payment2 == 'yes')
update_post_meta( $post_id, '_payment_method', 'payment2' );
else
update_post_meta( $post_id, '_payment_method', 'bacs' );
}
}
Это должно работать так, как вы ожидаете сейчас...
Код помещается в файл function.php вашей активной дочерней темы (или темы). Или также в любом плагине php-файлов.
Поскольку этот код взят из одного из моих ответов, вы не обязаны сохранять одинаковые имена функций начинающимися с "mv_"
это было связано с именем пользователя вопроса. Вы можете изменить его на "dan_"
например…
Справка: WooCommerce: добавление пользовательского Metabox на страницу заказа администратора
Функция, которая перечисляет платежные шлюзы по умолчанию в WooCommerce, называется core_gateways(). Эта функция подключена к фильтру с именем woocommerce_payment_gateways. Итак, первый шаг - удалить этот фильтр и добавить наш собственный. Я буду работать только в файле functions.php в папке темы (помните? Никогда не изменяйте основные файлы). Для этого мы будем использовать функции remove_filter() и add_filter():
remove_filter( 'woocommerce_payment_gateways', 'core_gateways' );
add_filter( 'woocommerce_payment_gateways', 'my_core_gateways' );
Теперь, когда мы удалили фильтр, вы можете видеть, что в функции add_filter() у нас есть обратный вызов my_core_gateways. Этот обратный вызов является именем функции, которая заменит функцию по умолчанию core_gateways(). Эта функция выводит список платежных шлюзов WooCommerce по умолчанию. Я изменю содержимое этой функции и заменю вызов на класс WC_Gateway_BACS. Этот класс является классом по умолчанию для банковского перевода. Вот код этой новой функции:
/**
* core_gateways function modified.
*
* @access public
* @param mixed $methods
* @return void
*/
function my_core_gateways( $methods ) {
$methods[] = 'WC_Gateway_BACS_custom';
$methods[] = 'WC_Gateway_Cheque';
$methods[] = 'WC_Gateway_COD';
$methods[] = 'WC_Gateway_Mijireh';
$methods[] = 'WC_Gateway_Paypal';
return $methods;
}
Как вы можете видеть, единственное изменение, которое я сделал, это то, что я заменил WC_Gateway_BACS на WC_Gateway_BACS_custom.
Ты все еще со мной? Подводя итог, мне нужно удалить фильтр, который вызывает платежные шлюзы по умолчанию, и использовать пользовательскую функцию. В этой пользовательской функции я заменяю вызов на класс BACS, и теперь мне нужно создать этот новый класс BACS. Для этого используйте этот код:
class WC_Gateway_BACS_custom extends WC_Gateway_BACS {
/**
* Process the payment and return the result
*
* @access public
* @param int $order_id
* @return array
*/
function process_payment( $order_id ) {
global $woocommerce;
$order = new WC_Order( $order_id );
// Mark as processing (that's what we want to change!)
$order->update_status('processing', __( 'Awaiting BACS payment', 'woocommerce' ));
// Reduce stock levels
$order->reduce_order_stock();
// Remove cart
$woocommerce->cart->empty_cart();
// Return thankyou redirect
return array(
'result' => 'success',
'redirect' => add_query_arg('key', $order->order_key, add_query_arg('order', $order->id, get_permalink(woocommerce_get_page_id('thanks'))))
);
}
}
В этом фрагменте я только изменил статус по умолчанию с "на удержании" на "обработка"…. и бум магия появляется! Теперь каждый заказ, оплаченный с использованием платежного шлюза BACS, будет помечен как обрабатываемый, а не как отложенный.