رفتن به مطلب

سوال درباره آژاکس در وردپرس


پست های پیشنهاد شده

سلام 

سوال من درباره تغییر کد زیر هست که در پنل ادمین وردپرس در پست تایپ به صورت ajax هست و من میخوام این دستور رو بتونم به صورت امن در بخش forentend  قالبم اجرا کنم 

$url = wp_nonce_url(admin_url('admin-ajax.php?action=my_post_meta&posttypename_id=' . $post->ID), 'my_post_meta');
echo 'my html cod ';

وقتی این لینک اعمال میشه در پنل دایرکت ادمین ، اون پست تایپ دارای یک چک باکس هست که با این لینک کنترل میشه و on  و off میشه  ( در بخش لیست نوشته ها ) 

این کد کاملا در بخش forentend هم کار میکنه ولی فکر نمیکنم خیلی از لحاظ امنیت به این شکل استفاده اش درست باشه چون در سورکد کاملا admin-ajax.php و مسیر ادمین مشخص هست . 

همچنین میخوام که این دستور فقط برای رول خاصی اجرا بشه.

چطور باید تغییرش بدم این کد رو که هم امن باشه و هم به درستی عملیات اجرا بشه 

لطفا با نمونه کد راهنمایی کنید 

ممنون

ویرایش شده توسط soma
لینک به ارسال

سلام

این نوع استفاده چه در بخش مدیریت چه در بخش کاربری بطور کلی معقول به نظر نمیرسه.

شما متغییرها رو نباید در آدرس پاس بدید. بهتر اینه که در جاوااسکریپت اونها رو بگیرید و بعد در ایجاکس اونها رو مقداردهی و پاس بدید.

نمونه کدش در کدکس وردپرس وجود داره.

لینک به ارسال
در در 3/15/2019 at 11:24، Morteza گفته است :

سلام

این نوع استفاده چه در بخش مدیریت چه در بخش کاربری بطور کلی معقول به نظر نمیرسه.

شما متغییرها رو نباید در آدرس پاس بدید. بهتر اینه که در جاوااسکریپت اونها رو بگیرید و بعد در ایجاکس اونها رو مقداردهی و پاس بدید.

نمونه کدش در کدکس وردپرس وجود داره.

سلام و ممنون از پاسختون @Morteza

1- علت اینکه این کار معقول به نظر نمیرسه چیه ؟ اگر امکانش هست کمی توضیح بدید ممنون میشم .

2- امکان داره لینک یا عنوان مشخصی که بتونم سریعتر به پاسخم برسم رو معرفی کنید ، چون دقیقا نمیدونم چه چیزی رو در کدکس سرچ کنم تا به نتیجه دلخواهم برسم ، با جستجوی ajax در کدکس و مطالعه نتایج به دست اومده بیشتر گیج شدم 

3- کاری که من تا الان انجام دادم به شرح زیره :

از طریق جاوااسکریپت هم کدها رو گذاشتم ولی دستور رو اجرا نمیکنه و فقط مقدار رو میگیره و نمایش میده

نمونه کدهام بهصورت زیر هست : البته لازم به توضیح است که من این کدها رو از یک بخش دیگه که کارکرد مشابه این مورد داشته برداشتم و برای این بخش دلخواهم میخواستم اضافه کنم که تمامی بخش های این کد ها کار میکنه ( یعنی اون متای خاص فعال شده یا نه را نمایش میده) ولی دستور فعال کردن و غیر فعال کردن متا رو اجرا نمیکنه 

در بخش php: 

<?php
$my_var = get_post_meta($post->ID, 'posttype_is_my_var_meta', true);
                       if ( $my_var == 'on' ) {
                            $posttype_is_my_var = 'فعال است';
                            $icon_class = 'icon-star3';
                            $icon_color = 'green';
                        } else {
                            $posttype_is_my_var = 'فعال نیست';
                            $icon_class = 'icon-star-o';
                            $icon_color = 'gray';
                        }
						$my_var_options = array(
                        'on' =>  'فعال',
                        'off' => 'غیر فعال',
                         );
						$posttype_is_my_var = isset($my_var_options[$posttype_is_my_var]) ? $my_var_options[$posttype_is_my_var] : $posttype_is_my_var;

                    ?>
                        <div class="posttype-my-var">
						  <a class="posttype-my-var-update" 
						  data-toggle="tooltip" 
						  data-placement="top" 
						  title="<?php echo esc_html($posttype_is_my_var); ?>" 
						  href="javascript:void(0);" 
						  id="posttype-my_var-<?php echo absint(get_the_ID()); ?>" 
						  data-id="<?php echo absint(get_the_ID()); ?>">  
						  <i class="<?php echo esc_html($icon_class); ?>" 
						  style="color:<?php echo esc_html($icon_color); ?>"></i>
						  </a></div>
						   <script type="text/javascript">
                            jQuery(document).ready(function () {
                                if (jQuery('[data-toggle="tooltip"]').length != '') {
                                    jQuery('[data-toggle="tooltip"]').tooltip();
                                }
                            });
                           </script>
						   
						   
<?php 
 public function update_posttype_my_var_callback() {

            global $current_user;
            $user_id = company_id_form_user_id($current_user->ID);

            $posttype_id = isset($_POST['posttype_id']) ? $_POST['posttype_id'] : '';
            $posttype_is_my_var = isset($_POST['posttype_is_my_var']) ? $_POST['posttype_is_my_var'] : '';

            $response = array( 'msg' =>'متن اطلاعیه', 'type' => 'error', 'label' => $posttype_is_my_var );
            if ( $posttype_id ) {
                $user_id = get_post_meta($posttype_id, 'posttype_user', true);
                if ( is_user_logged_in() && $user_id == $user_id ) {
                    $posttype_is_my_var = get_post_meta($posttype_id, 'posttype_is_my_var', true);
                    if ( $posttype_is_my_var == 'on' ) {
						update_post_meta($posttype_id, "posttype_is_my_var", 'off');

                        $response = array( 'msg' => 'متن اطلاعیه', 'type' => 'success', 'label' => 'فعال نیست', 'icon' => 'icon-eye-blocked', 'value' => 'off' );
                    } else {
                        update_post_meta($posttype_id, 'posttype_is_my_var', 'on');
                        $response = array( 'msg' => 'متن اطلاعیه', 'type' => 'success', 'label' => 'فعال است', 'icon' => 'icon-eye2', 'value' => 'on' );
                    }
                }
            }
            echo json_encode($response);
            die;
        }

در فایل جاوا اسکریپت هم این کدها رو اضافه کردم 

jQuery(document).on('click', '.posttype-my-var .posttype-my-var-update', function () {
    "use strict";
    var thisObj = jQuery(this);
    var posttype_id = jQuery(this).attr('data-id');
    var posttype_is_my-var = jQuery(this).attr('title');
    jQuery.ajax({
        type: "POST",
        url: globals.ajax_url,
        data: 'action=posttype_is_my_var&posttype_id=' + posttype_id + '&posttype_is_my_var=' + posttype_is_my-var,
        dataType: 'json',
        success: function (response) {
            show_response(response);
            if (jQuery('[data-toggle="tooltip"]').length != '') {
                jQuery('.posttype-my-var .posttype-my-var-update').tooltip('hide');
            }
            if (typeof response.icon !== 'undefined' && response.icon != '') {
                var icon_class = thisObj.parent().find('i').attr('class');
                thisObj.parent().find('i').removeClass(icon_class).addClass(response.icon);
            }
            if (typeof response.label !== 'undefined' && response.label != '') {
                thisObj.attr('data-original-title', response.label);
            }
            if (typeof response.value !== 'undefined' && response.value === 'on') {
                thisObj.parent().find('i').css("color", "green");
            } else {
                thisObj.parent().find('i').css("color", "red");
            }
        }
    });
});

دقیقا در بخش data  باید همون عملی که از طریق admin-ajax.php?action کد زیر اعمال میشه ، اجرا بشه که نمیشه ، کد زیر دقیقا  در جدول پست های اون پست تایپ مشخصم ، جلوی هر نوشته نمایش داده میشه و علاوه بر اینکه وضعیت فعال بودن یا فعال نبودن  اون متای مشخص رو نشون میده ، با کلیک روش میشه اون متای خاص رو کنترل کرد و فعال و غیر فعال کرد ، وقتی همین کد رو در پروفایل کاربر برای نمایش لیست پستهایی که ارسال کرده میگذارم دقیقا اعمال میشه  ولی خب باگ بزرگی دارهکه همون ابتدا هم گفتم 

$my_var = get_post_meta($post->ID, 'posttype_is_my_var', true);
                   $url = wp_nonce_url(admin_url('admin-ajax.php?action=posttype_is_my_var&posttype_id=' . $post->ID), 'posttype_is_my_var');
                    echo '<a href="' . esc_url($url) . '">';
                    if ( $my_var == 'on' ) {
                        echo '<i data-toggle="tooltip" data-placement="bottom" title="' . 'فعال است' . '" class="dashicons dashicons-star-filled"></i>';
                    } else {
                        echo '<i data-toggle="tooltip" data-placement="bottom" title="' . 'فهال نیست' . '" class="dashicons dashicons-star-empty"></i>';
                    }
                    echo '</a>';

 

لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...