2016-08-05 2 views
0

Итак, я создал магазин для компании, в которой я работаю. Люди платят, но они не доставляются к ним, потому что я буду навалом заказать предметы и отправить их в компанию, а затем они придут ко мне (на работе), чтобы выбрать свои вещи.PhP Изменение статуса заказа в Woocommerce

Так что у меня есть планшет, когда они приходят, чтобы забрать его там, где они положили в свой телефон #, чтобы найти свой заказ, а затем пометить его полностью. Я нашел плагин, который делает большую часть этого (Woocommerce Order Search), поэтому теперь я пытаюсь настроить кнопку, которую они могут просто щелкнуть, чтобы изменить статус своего заказа.

Я удалил «Адрес доставки» и положил его, но с помощью этого кода он полностью отменяет порядок, а не помечает его как полностью.

<td> 
    <form action="<?php add_action('woocommerce_order_status_completed') ?>" method="get"> 
<input type="hidden" value="http://www.store.bandwidthcorp.com/?page_id=13400"> 
<input type="submit" value="I Got It!"> 
</form></td> 

Тогда я пытался что-то вроде этого:

<td> 
<form action="<?php function order_complete {$order = new WC_Order($order_id);          $order->update_status('completed'); } 
add_action('order-complete') ?>" method="get"> 
<input type="hidden" value="http://www.store.bandwidthcorp.com/?page_id=13400"> 
<input type="submit" value="I Got It!"> 
</form></td> 

Но это ничего не делать вообще. Похоже, это должно быть довольно просто, но я не могу понять это. Заранее спасибо!

+0

Я считаю, что вам нужно отделить параметр «действие» от того, что вы на самом деле пытаетесь сделать. Действие формы больше похоже на URL-адрес, где выполняется обработка, а не фактическая обработка. – helgatheviking

ответ

1

Как я уже упоминал в своем комментарии, я думаю, мы хотим отделить вещи. Сначала мы удалим действие из формы. Это приведет к текущей странице перезагружать по форме представления

<form method="post"> 
<input type="hidden" name="mark_as_received" value="true"> 
<input type="hidden" name="order_id" value="<?php echo esc_attr($order_id);?>"> 
<?php wp_nonce_field('so_38792085_nonce_action', '_so_38792085_nonce_field'); ?> 
<input type="submit" value="I Got It!"> 
</form> 

Тогда мы будем слушать на ранней WordPress крюка действия для посланных входов формы.

add_action('wp_loaded', 'so_38792085_form_handler'); 
function so_38792085_form_handler(){ 

    // not a "mark as received" form submission 
    if (! isset($_POST['mark_as_received'])){ 
     return; 
    } 

    // basic security check 
    if (! isset($_POST['_so_38792085_nonce_field']) || ! wp_verify_nonce($_POST['_so_38792085_nonce_field'], 'so_38792085_nonce_action')) { 
     return; 
    } 

    // make sure order id is submitted 
    if (! isset($_POST['order_id'])){ 
     $order_id = intval($_POST['order_id']); 
     $order = wc_get_order($order_id); 
     $order->update_status("completed"); 
     return; 
    } 
} 

Вы можете добавить дополнительные проверки безопасности (например, права доступа пользователей), сообщения об ошибках, и я, вероятно, предлагаю сделать это с помощью AJAX, но это основное начало.

+0

это не работает по какой-то причине .. Как мне это сделать с AJAX? Я никогда не использовал его раньше. – jkranz

+0

Глядя снова '$ order_id' не определен. Я бы предложил всегда иметь ['WP_DEBUG'] (https://codex.wordpress.org/Debugging_in_WordPress#WP_DEBUG) и журнал' WP_DEBUG_LOG' включен при разработке. Вы бы получили предупреждение об этом. Я обновлю ответ. – helgatheviking

+0

AJAX - это асинхронный javascript и позволит вам изменить статус заказа без перезагрузки всей страницы. В Интернете есть много учебников, чтобы начать работу с ajax с помощью WordPress, но если вы просто нажмете на эту кнопку, это может не стоить того, кроме опыта обучения. – helgatheviking

Смежные вопросы