💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ رضا زمانی
ارور 500Internal server error در صدا زدن متدهای ایجکس
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۳۱ خرداد ۱۴۰۳

سلام.وقت بخیر. کدهای کلاس AjaxHandler رو بصورت زیر پیاده کردم:

<?php
namespace App\Classes;
class AjaxHandler
{
    private $actions =  [
        'add_user',
        'trunc_user',
    ];
    public function __construct()
    {
        foreach ($this->actions as $action) {
             add_action("wp_ajax_" . $action,$action);
             add_action("wp_ajax_nopriv_".$action,$action );
        }
    }
}
new AjaxHandler();

ولی جالب اینجاست که در هنگام ایجکس و صدا زدن متد add_user کد 200 صادر میشه ولی در هنگام صدا زدن متد trunc_user با خطای 500Internal server error مواجه میشم(هر دو متد در تریت User هستند).علت چیه؟

کدها کلاس رو بصورت زیر بازنویسی کردم و تریت یوزر رو ضمیمه کردم مشکل رفع شد.ولی علت مشکل کدهای بالا رو متوجه نشدم

<?php
namespace App\Classes;
class AjaxHandler
{
    use User; // ضمیمه کردن تریت یوزر
    private $actions =  [
        'add_user',
        'trunc_user',
    ];
    public function __construct()
    {
        foreach ($this->actions as $action) {
             add_action("wp_ajax_" . $action,[$this , $action]);
             add_action("wp_ajax_nopriv_".$action, [$this , $action] );
        }
    }
}
new AjaxHandler();

درود آقای زمانی عزیز

به نظر می‌رسه مشکل اصلی به نحوه تعریف هندلرهای ایجکس برمی‌گرده

شما مستقیماً نام متد رو به عنوان کال‌بک (Callback) استفاده کردید:

add_action("wp_ajax_" . $action, $action);
add_action("wp_ajax_nopriv_" . $action, $action);
  • اینجا، وردپرس نمی‌دونه این متدها کجا تعریف شدن. بهتره که از آرایه‌ای استفاده کنیم که شیء و نام متد رو شامل بشه
  • ترتیب اینکلود کردن فایل‌ها رو بررسی کنید: باید مطمئن بشید که فایل‌ها به درستی و به ترتیب صحیح اینکلود شدن.
  • فایل AjaxHandler.php:
  • <?php
    namespace App\Classes;
    class AjaxHandler
    {
        use User;
        private $actions =  [
            'add_user',
            'trunc_user',
        ];
        public function __construct()
        {
            foreach ($this->actions as $action) {
                 add_action("wp_ajax_" . $action, [$this, $action]);
                 add_action("wp_ajax_nopriv_" . $action, [$this, $action]);
            }
        }
    }
    new AjaxHandler();
  • تو این اصلاحات، شما از آرایه [ $this, $action ] استفاده کردید که باعث می‌شه وردپرس بدونه این متدها باید از روی شیء AjaxHandler فراخوانی بشن. اینطوری مشکل دسترسی به متدها حل می‌شه و دیگه خطای 500 نمی‌گیرید.

موفق باشید

محمدرسول اصغری ۳۱ خرداد ۱۴۰۳، ۱۱:۴۶