Что такое WordPress / WooCommerce Хук, который пожар после WooCommerce продукта сохранен - PullRequest
0 голосов
/ 01 января 2019

Я хочу отправить данные продукта woocommerce после того, как пользователь создаст и сохранит их, в веб-сервис почтовой компании через soap-клиент.поэтому мне нужен крюк, который срабатывает после того, как пользователь создаст продукт.Я много ищу и нахожу какое-то слово для прессы и woocommerce хук, но никто из них не выполняет мою работу.после отправки даты веб-сервис возвращает идентификатор, который должен быть указан как sku продукта.Слушайте, это мой код функции: (аргумент из ловушки save_post_product)

function productPublished ($ID , $post , $update){
$product = wc_get_product( $post->ID);
$user = get_option ('myUsername');
$pass = get_option ('myPassword');
$name = $product->get_name();
$price = $product->get_regular_price();
$weight = $product->get_weight() * 1000;
$count = $product->get_stock_quantity();
$description = $product->get_short_description();
$result = $client -> AddStuff ([
    'username' => $user,
    'password' => $pass,
    'name' => $name,
    'price' => $price,
    'weight' => $weight, 
    'count' => $count,
    'description' => $description,
    'percentDiscount' => 0
]);
$stuff_id=(int)$result->AddStuffResult;
update_post_meta($product->get_id(),'_sku',$stuff_id);
}

Я использую save_post_product действие.кажется, что он запускается после того, как пользователь щелкнул новый продукт, прежде чем ввести имя, цену и т. д., поскольку данные о продукте по умолчанию отправляются в веб-службу, а sku генерируется и сохраняется до ввода каких-либо данных.я использую transition_post_status и добавляю этот код к моей функции:

if($old_status != 'publish' && $new_status == 'publish' && 
!empty($post->ID) && in_array( $post->post_type, array( 'product') )){
code...}

результат был таким же, как save_post_product.я использую publish_product действие и результат не изменился.я использую draft_to_publish крючок.Это похоже на огонь после того, как я ввел название продукта и описание.имя отправлено на веб-сервис, но цена и вес не указаны.sku не сохраняется в базе данных (почему ??).я знаю, что есть еще один вопрос здесь , который утверждает, что save_post срабатывает после публикации сообщения и сохранения в БД.но я думаю, что woocommerce отличается.кажется, сохранить сообщение после ввода имени и описания и до ввода цены и т. д. любое предложение ???

1 Ответ

0 голосов
/ 01 января 2019

Требуются следующие действия:

add_action('woocommerce_update_product', 'productPublished');

add_action('woocommerce_new_product', 'productPublished');

function productPublished($product_id){
    //...
}

Вы можете найти их обоих (откуда они запускаются) в исходном коде Woo здесь:

https://docs.woocommerce.com/wc-apidocs/source-class-WC_Product_Data_Store_CPT.html#237

Я на самом деле посмотрел их в обратном направлении, сначала обнаружив, где находится исходный код для сохранения продуктов, а затем искал хуки в этих методах (создание / обновление).

 //found on Line 134 method create
 do_action( 'woocommerce_new_product', $id );


 //found on Line 237 method update
 do_action( 'woocommerce_update_product', $product->get_id() );

Вы будететакже необходимо изменить эту строку:

function productPublished ($ID , $post , $update){
    $product = wc_get_product( $post->ID);
}

На

function productPublished($product_id){
    $product = wc_get_product( $product_id);
   //....
}

Я не думаю, что другие аргументы (которые отсутствуют) имеют значение для вашего кода.Например, если это обновление или новый продукт, я также не вижу $post, используемого для получения идентификатора продукта, который у нас уже есть.

ОБНОВЛЕНИЕ (определение аргументов для обратного вызова)

Если вы не уверены в аргументах обратного вызова, вы можете посмотреть в исходном коде (как я это делал выше), или, если вы можете найти его в документации, или, в крайнем случае, вы можете просто вывести их.Лучший способ их вывода - один из этих 3

Вот пример, который я построил сминимально / упрощенная рабочая система хуков по образцу WordPress.По причинам, связанным с тестированием, и потому, что на самом деле это не так сложно построить, когда вы знаете, как это работает:

<code>//global storage (functions, not classes)
global $actions;
$actions = [];

//substitute wordpress add_action function (for testing only) 
function add_action($action, $callback, $priorty=10, $num_args=1){
    global $actions;
    $actions[$action][] = [
         'exec' => $callback,
         'priorty'=>$priorty,
         'num_args' => $num_args
    ];

}
//substitute wordpress do_action function (for testing only) 
function do_action($action, ...$args){
    // PHP5.6+ variadic (...$args) wraps all following arguments in an array inside $args (sort of the opposite of func_get_args)
    global $actions;

    if(empty($actions[$action])) return;
    //sort by priory
    usort($actions[$action], function($a,$b){
       //PHP7+ "spaceship" comparison operator (<=>)
       return $b['priorty']<=>$a['priorty'];
    });

    foreach($actions[$action] as $settings){
        //reduce the argument list
        call_user_func_array($settings['exec'], array_slice($args, 0, $settings['num_args']));
    }
}

//test callback
function callback1(){
     echo "\n\n".__FUNCTION__."\n";
    print_r(func_get_args());
}

//test callback
function callback2(){
    echo "\n\n".__FUNCTION__."\n";
    try{
        //throw an empty exception
        throw new Exception;
    }catch(\Exception $e){
         //pre tags preserve whitespace (white-space : pre)
        echo "<pre>";
        //output the stacktrace of the callback
        echo $e->getTraceAsString();
        echo "\n\n
";}} // Регистрация обратных вызовов Hook, добавленных в обратном порядке, отсортированных по приоритету add_action ('someaction', 'callback2 ', 5, 4); add_action (' someaction ',' callback1 ', 1, 5); // выполнить ловушку do_action (' someaction ', 1234,' foo ', [' one '=> 1], новый stdClass, false);

Вывод:

<code>callback2
<pre>#0 [...][...](25): callback2(1234, 'foo', Array, Object(stdClass))
#1 [...][...](52): do_action('someaction', 1234, 'foo', Array, Object(stdClass), false)
#2 {main}

Массив callback1 ([0] => 1234 [1] => foo [2] => Массив ([one] => 1)[3] => stdClass Object () [4] =>)

Песочница

Stacktrace Как вы можете видеть вВ первом выводе мы имеем полную трассировку стека приложения (за исключением отредактированной информации), включая вызовы функций и аргументы, используемые для этих вызовов. Также обратите внимание, что в этом примере я зарегистрировал 2-й, но приоритет (установлен в add_action)заставил его исполниться первым. Наконец, использовались только 4 из 5 аргументов (также, как вызывать add_action).

Итак, do_action был назван так (с 'action 'и 5 других аргументов):

 do_action('someaction', 1234, 'foo', Array, Object(stdClass), false)

И реальный обратный вызов был вызван так (без' действия 'и только 4 других аргументов):

 callback2(1234, 'foo', Array, Object(stdClass))

ФункцияАргументы Это немного более прямолинейно, но это не дает вам исходный вызов, поэтому вы не будете знать максимальное количество аргументов (которое вы можете получить из вызова do_action в stacktrace).Но если вы просто хотите быстро взглянуть на поступающие данные, это прекрасно.Также я должен упомянуть, что это использует все 5 аргументов, которые вы можете ясно увидеть в массиве для второго вывода.[4] => имеет значение false, обычно print_r отображает значение false (просто пустое).

Отладка Backtrace К сожалению, debug_print_backtrace отключено (по соображениям безопасности) вsandbox и Exception stacktrace сильно отредактированы (как правило, они имеют имена файлов и строки, из которых функции вызываются и расположены в них) также по соображениям безопасности.Оба из них могут возвращать аргументы от таких вещей, как соединение с базой данных, которая будет содержать пароль БД в виде простого текста, например.В любом случае, debug_print_backtrace довольно близко к тому, как выглядит трассировка стека исключений.

Summery

Но в любом случае это должно дать вам представление о том, чтоданные выглядят так.Мы можем использовать такие функции (как Reflection) для опроса приложения во время выполнения.Я уверен, что есть и другие / более способы сделать подобные вещи.

PS.Это само собой разумеется, но я все равно скажу, что эти методы работают с любой функцией PHP и могут быть весьма полезны.Также, как отмечалось выше, вы никогда не должны показывать стековые трассировки на живом компьютере.

В любом случае, удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...