Требуются следующие действия:
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 и могут быть весьма полезны.Также, как отмечалось выше, вы никогда не должны показывать стековые трассировки на живом компьютере.
В любом случае, удачи.