【发布时间】:2018-03-31 22:45:06
【问题描述】:
我正在开发一个 Woocommerce 运输插件,其中我有一个类方法,它在自定义 do_action 上触发
try {
$client = new SoapClient( plugin_dir_path( dirname( __FILE__ ) ) . 'includes/wsdl/Test.wsdl', ['trace' => true, 'exceptions' => true ] );
$results = $client->__soapCall('CreateSomml', ['parameters' => ['Details' => $bill->__toArray() ]]);
} catch (SoapFault $e) {
wc_add_wp_error_notices(new WP_Error('soap', $e->getMessage(), isset($client)? $client->__getLastRequest() : $bill->__toArray() ));
// print $client->__getLastRequest();
// throw $e;
}
它尝试连接到 Web 服务并捕获任何 SoapFault 并添加错误通知,但在运行代码时我遇到了错误
致命错误:在第 80 行的 ...../wp-content/plugins/woocommerce/includes/wc-notice-functions.php 中以 null 调用成员函数 get()
根据文档导致
function wc_add_notice( $message, $notice_type = 'success' ) {
if ( ! did_action( 'woocommerce_init' ) ) {
wc_doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.3' );
return;
}
$notices = WC()->session->get( 'wc_notices', array() );
// Backward compatibility
if ( 'success' === $notice_type ) {
$message = apply_filters( 'woocommerce_add_message', $message );
}
$notices[ $notice_type ][] = apply_filters( 'woocommerce_add_' . $notice_type, $message );
WC()->session->set( 'wc_notices', $notices );
}
我认为它可能是
WC()->session->set( 'wc_notices', $notices );但不知道为什么会出错。
该操作是从后端管理员管理触发的。可能是问题所在?
我正在使用 Wordpress 4.8 和 Woocommerce 3.2.1 运行 PHP 5.6.27
更新:
一直在寻找错误,我能想到的只是
致命错误:未捕获的错误:在 /var/www/wordpress/wp-content/plugins/woocommerce/includes/wc-notice-functions.php:80 中的 null 上调用成员函数 get() 堆栈跟踪:# 0 /var/www/wordpress/wp-content/plugins/woocommerce/includes/wc-notice-functions.php(198): wc_add_notice('Invalid User Cr...', 'error') #1 /var/www /wordpress/wp-content/plugins/wc-trinicargo-shipping/includes/class-wc-trinicargo-shipping-create-waybill.php(80): wc_add_wp_error_notices(Object(WP_Error)) #2 /var/www/wordpress/ wp-includes/class-wp-hook.php(296): Wc_Trinicargo_Shipping_Create_Waybill->create() #3 /var/www/wordpress/wp-includes/class-wp-hook.php(323): WP_Hook->apply_filters( '', 数组) #4 /var/www/wordpress/wp-includes/plugin.php(453): WP_Hook->do_action(Array) #5 /var/www/wordpress/wp-content/plugins/wc-trinicargo -shipping/includes/class-wc-trinicargo-shipping-create-waybill.php(68): do_action('wc_trinicargo_c...') #6 /var/www/wordpress/wp-content/plugins/wc-trinicargo-运输/管理/部分/wc-trinic argo-shipping-init-methods.php(163): Wc_ in /var/www/wordpress/wp-content/plugins/woocommerce/includes/wc-notice-functions.php 第 80 行
为什么会话没有开始?我该如何启动它?
【问题讨论】:
-
哪个
do_action你迷上了?该错误表明 woocommerce 会话尚未开始。 -
@Mikk3lRo 这是我专门为此任务创建的自定义操作。如何“开始一个会话”来满足这一要求?
-
那么它是如何被调用的呢?如果您回溯,它必须从一些“本机”wordpress 钩子触发,对吗? 3.2.1(最新)中的第 80 行不是
return,也不是set()。这是get()- 所以如果你在第 80 行有任何其他内容,你要么更新失败,要么你自己在代码中“玩弄”......不要那样做:p -
@Mikk3lRo 还没有玩过 woocommerce 它开箱即用。本机钩子可能是
woocommerce_order_status_processing,它又将另一个类方法实例化并调用有问题的类方法。如何建立一个 WC()->session? -
@Kendall 你有没有得到这个答案?有完全相同的问题。
标签: php wordpress woocommerce