【问题标题】:member function get() on null on woocommerce/includes/wc-notice-functions.php on line 80woocommerce/includes/wc-notice-functions.php 上第 80 行的 null 上的成员函数 get()
【发布时间】: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 );
}

Line 80 is return

我认为它可能是

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


【解决方案1】:

因此,对于任何正在寻找解决方案的人 - 问题是 WC()-> 会话在此处尚不可用。我在尝试在“admin_post”操作中添加通知时遇到了问题。在这里初始化一个空会话对我有用:

WC()->session = new WC_Session_Handler();
WC()->session->init();

在这两行之后,我能够成功使用 wc_add_notice。希望对某人有所帮助。

【讨论】:

  • 谢谢!我一直在努力寻找答案。
猜你喜欢
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
  • 2016-05-24
  • 2021-10-27
  • 2021-01-23
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多