سؤال

لدي هذا الرمز لإزالة المشاركات اليتيمة بعد حذف نوع المنشور المخصص.

إنه يعمل، لكن هذا الكود...

global $wpdb;
$wpdb->query( 
    $wpdb->prepare( 
    "DELETE a,b,c FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
    WHERE a.post_type='attorneys'"
  )
);

...يرمي هذا الخطأ:

إشعار PHP:تم استدعاء wpdb::prepare بشكل غير صحيح.يجب أن تحتوي وسيطة الاستعلام الخاصة بـ wpdb::prepare() على عنصر نائب.

إذن بعد القراءة التفسير على make.wordpress.org بواسطة أندرو ناسين، أنا (نوعًا ما) أجمع أن ... حسنًا..أفتقد الحجة الثانية.

ثم بعد القراءة هذا المنشور المكدس, ، أنا أتساءل عما إذا كنت بحاجة إلى prepare() وظيفة. هناك أي متغيرات تحمل قيم غير معروفة؟أنا لست واضحا في هذا الشأن.

...ماذا ينقصني؟

تحديث:يعمل هذا الرمز أيضًا، ولكن بدون الإعداد () أتساءل عما إذا كان آمنًا.

global $wpdb;
$wpdb->query( 
  "DELETE a,b,c FROM wp_posts a
  LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
  LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
  WHERE a.post_type='attorneys'"
);

يرجى تقديم النصيحة.

هل كانت مفيدة؟

المحلول

ينصح دائما باستخدامه $wpdb->prepare عندما تأخذ مدخلات من المستخدم.سيساعد هذا في حماية الاستعلامات من حقن SQL.لمزيد من التفاصيل، تحقق من الدستور الغذائي

عندما تستخدم $wpdb->prepare, ، يجب عليك تمرير المتغيرات إلى الاستعلام.في حالتك، يمكنك تخطي استخدام $wpdb->prepare لأنك تستخدم قيمة مشفرة بشكل ثابت.ولكن إذا كان لديك نفس القيمة من حيث المتغير، فأنت بحاجة إلى تعديلها على النحو التالي

$post_type = 'attorneys';

$wpdb->query( 
     $wpdb->prepare(
          "DELETE a,b,c FROM wp_posts a
          LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
          LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
          WHERE a.post_type=%s",
          $post_type
     )
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى wordpress.stackexchange
scroll top