【问题标题】:Call for undefined function in Wordpress plugin在 Wordpress 插件中调用未定义的函数
【发布时间】:2020-04-24 19:55:15
【问题描述】:

我目前正在编写一个适用于 WooCommerce 的 WordPress 插件。我查询 WooCommerce 订单,目标是使用这些订单的地址,使用来自荷兰路线规划服务的 API 来规划送货路线。

为我写PHP已经有一段时间了,我上次写的PHP是7年前,所以我的PHP技能有点生疏。

查询订单后,我想调用函数routexl_generate(),这个函数在我的代码中定义。但是,运行代码会引发以下错误:

致命错误:未捕获错误:调用 /home/u48469p44993/domains/dev.geusdiervoeding.nl/public_html/wp-content/plugins/geusdiervoeding-wc-rxlplanner/geusdiervoeding-wc-rxlplanner 中的未定义函数 routexl_generate()。 php:120 堆栈跟踪:#0 /home/u48469p44993/domains/dev.geusdiervoeding.nl/public_html/wp-content/plugins/geusdiervoeding-wc-rxlplanner/geusdiervoeding-wc-rxlplanner.php(100): wc_order_query() # 1 /home/u48469p44993/domains/dev.geusdiervoeding.nl/public_html/wp-includes/class-wp-hook.php(288): rxlp_menu_init('') #2 /home/u48469p44993/domains/dev.geusdiervoeding.nl /public_html/wp-includes/class-wp-hook.php(312): WP_Hook->apply_filters('', Array) #3 /home/u48469p44993/domains/dev.geusdiervoeding.nl/public_html/wp-includes/plugin .php(478): WP_Hook->do_action(Array) #4 /home/u48469p44993/domains/dev.geusdiervoeding.nl/public_html/wp-admin/admin.php(254): do_action('woocommerce_pag...') #5 {main} 在 /home/u48469p44993/domains/dev.geusdiervoeding.nl/public_html/wp-cont 中抛出ent/plugins/geusdiervoeding-wc-rxlplanner/geusdiervoeding-wc-rxlplanner.php 在第 120 行

我真的不明白它为什么会这样,因为函数已定义......不胜感激。

这是(部分)我的代码:

function wc_order_query()
{   

    if(isset($_GET['area'])) { 
        $route = $_GET[ 'area' ];
        $date = $_GET[ 'date' ];    

        $args = array(
            'status' => $route,
            'meta_key' => 'jckwds_date',
            'meta_value' => $date,      
        );
        $orders = wc_get_orders( $args );

        if (empty($orders)) {
            echo ('<ul><li>Op '.$date.' zijn er geen bezorgorders voor het gekozen routegebied.</li></ul>');
        } else {
            routexl_generate();
        }

        //RouteXL API aanroepen
        function routexl_generate(){
            //Query results to API
        }
    }

【问题讨论】:

  • 是否在一个类中定义了 $this-&gt; 缺失?
  • wc_get_orders 来自 WooCommerce 开发的一个类。我的代码是一个使用该类的插件。你是什​​么意思 bij $this->
  • 如果你在 INSIDE AN IF 中定义了函数,那么直到实际执行到达它才真正定义它。换句话说,它没有在正常的代码解释过程中定义为在 IF 之外定义的函数

标签: php wordpress woocommerce


【解决方案1】:

首先你必须声明函数然后调用你犯了一个错误你在声明之前调用了一个函数

//RouteXL API aanroepen
function routexl_generate(){
 //Query results to API
}

function wc_order_query() { 

    if(isset($_GET['area'])){ 
        $route = $_GET[ 'area' ];
        $date = $_GET[ 'date' ];    

        $args = array(
        'status' => $route,
        'meta_key' => 'jckwds_date',
        'meta_value' => $date,      
        );
        $orders = wc_get_orders( $args );
        if (empty($orders)) {
            echo ('<ul><li>Op '.$date.' zijn er geen bezorgorders voor het gekozen routegebied.</li></ul>');
        }else{
            routexl_generate();
        }
    }
}

【讨论】:

    【解决方案2】:

    我意识到这只是“您的代码的一部分”,但您所显示的内容存在问题:

    • wc_order_query() 函数未关闭;
    • routexl_generate() 在里面 wc_order_query();
    • routexl_generate()if 内,条件在 wc_order_query()

    从技术上讲,嵌套函数没有问题,但为了清楚起见,将 routexl_generate() 完全移出函数是有意义的:

    function wc_order_query() {
        if (isset($_GET['area'])) {
            $route = $_GET[ 'area' ];
            $date = $_GET[ 'date' ];
    
            $args = array(
                'status' => $route,
                'meta_key' => 'jckwds_date',
                'meta_value' => $date,
            );
    
            $orders = wc_get_orders( $args );
    
            if (empty($orders)) {
                echo ('<ul><li>Op '.$date.' zijn er geen bezorgorders voor het gekozen routegebied.</li></ul>');
            } else {
                routexl_generate();
            }
        }
    }
    
    //  RouteXL API aanroepen
    
    function routexl_generate(){
        //  Query results to API
    }
    

    测试和工作。

    【讨论】:

    • 没问题 - 不要忘记接受这些答案之一!
    【解决方案3】:

    如果你在 INSIDE AN IF 中定义了一个函数,那么在实际执行到达它之前它不会被实际定义。换句话说,它没有在正常的代码解释过程中定义为在 IF 之外定义的函数

    因此,如果您想在 IF 中定义函数并且我不建议这样做,您必须在调用它们之前定义它们,就好像解释器只是单通一样。

    示例:这行得通

    function x($p = false)
    {
        function xx($pp)
        {
            echo $pp;
        }
    
        if ($p) {
            xx($p);
        }
    
    }
    
    x('hello');
    

    结果

    你好

    这不是

    function x($p = false)
    {
    
        if ($p) {
            xx($p);
        }
        function xx($pp)
        {
            echo $pp;
        }    
    }
    
    x('hello');
    

    结果

    致命错误:未捕获错误:调用未定义函数 xx()

    【讨论】:

    • 谢谢!在 if 语句中定义函数不是我的意图,我的 end if 在错误的行上。现在可以使用了
    • 良好的代码缩进将帮助我们阅读代码,更重要的是,它将帮助您调试代码Take a quick look at a coding standard 为您自己的利益。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 2014-02-13
    • 2012-10-31
    • 2023-03-07
    • 2021-09-21
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多