💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱۱ centurion mars
فعال ماندن پلاگین و عدم غیرفعال شدن
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۲۱ فروردین ۱۴۰۱

سلام

کدهای من رو میشود بررسی کنید،

پلاگین فعال میمونه و با برداشتن تیک چک باکس و ذخیره کردن بازم بعد از رفرش صفحه میاد رو فعال بودن و تیک چک باکس بازم خودش فعال میشه.

تصویر دیتابیس بعد از غیرفعال کردن:

7c9e-image_2022-04-10_130630222.pngکدهای تمپلیت:

<p style="
    color:red;
    color: #680ec0;
    font-size: 41px;
    margin: 1% 30%;
    border: 0px solid black;
    border-radius: 11px;
    padding: 38px;
    box-sizing: border-box;
    text-align: center;
    background-image: linear-gradient(to right bottom, #3d5f929c, #406a96c7, #539aa0, #5da050a6, #a8eb1233);
    ">wp apis pluginp>
<div class="wrap">
    <form action="" method="post">
        <label for="is_plugin_active">
            <input name="is_plugin_active" type="checkbox" id="is_plugin_active"
             echo isset($current_plugin_status) && intval($current_plugin_status) > 0 ? 'checked':''; ?>
            >
            فعال بودن پلاگین
        label>
        <div>
        <button class="button button-primary" type="submit" name="saveSettings">ذخیره سازیbutton>
        div>
    form>
div>

کدهای نمایش منو و زیرمنو:

add_action('admin_menu','wp_apis_register_menu');
function wp_apis_register_menu(){
    add_menu_page(
        'تنظیمات پلاگین',
        'تنظیمات پلاگین',
        'manage_options',
        'wp_apis_admin',
        'wp_apis_main_menu_handler'
    );
    
 
    add_submenu_page(
        'wp_apis_admin',
        'تنظیمات',
        'تنظیمات',
        'manage_options',
        'wp_apis',
        'wp_apis_main_menu'
    );
    add_submenu_page(
        'wp_apis_admin',
        '1تنظیمات',
        '1تنظیمات',
        'manage_options',
        'wp_apis1',
        'wp_apis_main_menu1'
    );
    
}
function wp_apis_main_menu_handler(){
    $current_plugin_status = get_option('wp_apis_is_active');
    if(isset($_POST['saveSettings']))
    {
        $is_plugin_active = isset($_POST['is_plugin_active']) ? 1 : 0;
        
        add_option('wp_apis_is_active',$is_plugin_active);
    }
    include WP_APIS_TPL.'tpl-admin/menu/tpl-admin-menu.php';
}
function wp_apis_main_menu(){
    include WP_APIS_TPL.'tpl-admin/menu/general.php';
}
function wp_apis_main_menu1(){
}

بعد از تغییر دستی مقدار option در دیتابیس غیرفعال میشود ولی بازهم غیر فعال می‌ماند و با فعال کردن چک باکس و ذخیره بعد از رفرش صفحه باز غیر فعال میماند.

centurion mars ۲۱ فروردین ۱۴۰۱، ۰۸:۵۱

سلام از متغیر $current_plugin_status یه var_dump بگیرید در دو حالت فعال و غیر فعال بودن افزونه و مقدار برگشتی رو بگید چی هست

وحید صالحی ۲۱ فروردین ۱۴۰۱، ۰۹:۰۵

پلاگین در حالت غیر فعال

819b-image_2022-04-10_153353500.png

دیتابیس برای زمان غیر فعال بودن

9a4d-image_2022-04-10_153419607.png


فعالشم میکنم بازم تغیری در متغییر و دیتابیس ایجاد نمیشه!

امکان هست مربوط به برقراری ارتباط با دیتابیس باشه؟

تیک چک باکس میزنم => d9d5-image_2022-04-10_153957413.png


بعد از زدن دکمه ذخیره سازی => bd1b-image_2022-04-10_154203049.png


و دیتابیس بدون تغییر(رفرش کردم ضفحه دیتابیس)=

5c44-image_2022-04-10_154442660.png


centurion mars ۲۱ فروردین ۱۴۰۱، ۱۱:۱۵

خوب متدی که option رو ذخیره میکنه کار نمی‌کنه و در دیتابیس کلید wp_apis_is_active آپدیت نمیشه توی ذخیره سازی مشکل دارید بجای add_option از update_option باید استفاده کنید و کدتون رو هم به شکل زیر تغییر بدید که بار اول که کلید option مورد نظر وجود نداشت بسازدش و بارهای بعدی فقط آپدیتش کنه

به کامنت هایی هم که گذاشتم دقت کنید توضیح دادم چه کاری باید انجام میشه در هر مرحله

if(isset($_POST['saveSettings']))
    {
        if ( get_option( 'wp_apis_is_active' ) !== false ) {
//or
//if ( get_option( 'wp_apis_is_active' )) {
              // The option already exists, so update it.
              update_option('wp_apis_is_active',$is_plugin_active);
          } else {
              // The option hasn't been created yet, so first add it 
               add_option('wp_apis_is_active',$is_plugin_active);
           }  
    }
وحید صالحی ۲۱ فروردین ۱۴۰۱، ۱۶:۵۷

ممنون جناب صالحی

من از update_option استفاده کردم مشکل ذخیره شدن در دیتابیس حل شد

اما در صفحه پلاگین نمایش چک باکس اپدیت نمیشد

فکر کنم بخاطر متغیر current_plugin_status چون در اول بود مقدار ذخیره میکرد در خودش و بعد از همون مقدار اولیه استفاده میکرد برای نمایش،

نمیدونم متوجه منظورم شدید یا نه!!ببخشید من خوب توضیح نمیدم چون زیاد نمیدونم. :)


بهرحال متغیر current_plugin_status رو به بعد از شرط if بردم و مشکل آپدیت شدن نمایش چک باکس هم درست شد.

کد نهایی

 if(isset($_POST['saveSettings']))
    {
        $is_plugin_active = isset($_POST['is_plugin_active']) ? 1 : 0;
        
        //add_option('wp_apis_is_active',$is_plugin_active);
        update_option('wp_apis_is_active',$is_plugin_active);
   }
   $current_plugin_status = get_option('wp_apis_is_active');
    var_dump($current_plugin_status);


centurion mars ۲۱ فروردین ۱۴۰۱، ۱۷:۱۸

من مشکلم تو کدها با تغییر کد add_option به update_optoin حل شد

اما میخواستم بدونم چه مشکلی درمتد option وجود داشت که در دیتابیس کلید wp_apis_is_active آپدیت نمیشه و مقدار ذخیره نمیشه؟

برام سوال شده بود!!

بازم ممنون برای پاسخگویی شما

centurion mars ۲۱ فروردین ۱۴۰۱، ۱۷:۲۴

خواهش می‌کنم نه به اون ربطی نداره

متد intval رو در چک باکس که مقدار برگشی متغیر $current_plugin_status چاپ می‌کنه بردارید چون مقدار ذخیر شده در دیتابیس از نوع داده رشته یا string هست متد intval چک می‌کنه که داده ما حتما از نوع intger باشه اگر نبود حتی اگر 1 هم بود بجاش صفر میزار چون از نوع string هست .

نکته بعد متغیر $current_plugin_status مقدارش رو از کجا می‌گیره چون به لحظه با تیک چک باکس مقدار می‌گیره بعد رفرش دوبار بر می‌گرده به حالت پیشفرض شما مقدار چک باکس رو باید از دیتابیس بگیرید


به شکل زیر باید عمل کنید

<div class="wrap">
    <form action="" method="post">
        <label for="is_plugin_active">
            <input name="is_plugin_active" type="checkbox" id="is_plugin_active"
             echo isset(get_otion('wp_apis_is_active') == 1 ? 'checked':''; ?>
            >
            فعال بودن پلاگین
        
        <div>
        <button class="button button-primary" type="submit" name="saveSettings">ذخیره سازیbutton>
        div>
    form>
div>


بهترین پاسخ
وحید صالحی ۲۱ فروردین ۱۴۰۱، ۱۷:۳۳

بله متوجه شدم

intval حذف شد بجای اون بعد از

(get_otion('wp_apis_is_active') ==1

از عملگر = = استفاده کردین

فقط کاربردش مث زبان‌های دیگه هست؟

درزبان پایتون از این اپراتور برای چک کردن و بررسی استفاده میکنیم که مقدار true & false برمیگردونه ! اینجا هم در phpهمین گونه عمل میکنه؟


بعد راه حل دیگه ای هم میشه استفاده کرد آیا؟

نمیدونم دقیق ،مثلا بجای تابع isset از if استفاده کنیم !

centurion mars ۲۱ فروردین ۱۴۰۱، ۱۷:۵۶

نه همین روش کفایت می‌کنه

وحید صالحی ۲۱ فروردین ۱۴۰۱، ۱۸:۱۵


تشکر ♥‿♥


centurion mars ۲۱ فروردین ۱۴۰۱، ۱۸:۲۴

سلام.

پاسخ استاد صالحی رو تیک بزنید تا تاپیک بسته بشه.

محسن موحد ۲۱ فروردین ۱۴۰۱، ۲۲:۰۰