簡體   English   中英

在 Wordpress 插件中調用未定義的函數

[英]Call for undefined function in Wordpress plugin

我目前正在編寫一個適用於 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-0rxlplanner/geusdiervoeding-wc-0r中的未定義函數 routexl_generate()堆棧跟蹤:#0 /home/u48469p44993/domains/dev.geusdiervoeding.nl/public_html/wp-content/plugins/geusdiervoeding-wc-rxlplanner/geusdiervoeding-wc-rxlplanner.php(100): #wc_order_home() /u48469p44993/domains/dev.geusdiervoeding.nl/public_html/wp-includes/class-wp-hook.php(288): rxlp_menu_init('') #2 /home/u48469p44993/domains/dev.geusnier/voeding_public 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-content /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
        }
    }

我意識到這只是“您代碼的一部分”,但是您所展示的內容存在問題:

  • 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
}

測試和工作。

首先你必須聲明函數然后調用你犯了一個錯誤你在聲明之前調用了一個函數

//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();
        }
    }
}

如果您在 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM