كيفية تنزيل مكونات WordPress الإضافية وتثبيتها وتنشيطها واستبدالها برمجيًا وتلقائيًا

نشرت: 2018-09-18

من الصعب حمل المستخدمين على فعل أي شيء. سواء كنت تملأ نموذجًا أو تقوم فقط ببضع نقرات - فهناك مقاومة متأصلة. حتى لو كان هذا الإجراء لصالح المستخدمين ، مثل تغيير كلمة مرور ضعيفة ، فلن يفعلوا ذلك. ينطبق الشيء نفسه على جعل المستخدمين يقومون بتثبيت مكون إضافي مطلوب ، أو الأسوأ من ذلك ، استبدال مكون إضافي نشط بمكوِّن إضافي جديد. إنها مهمة حدودية مستحيلة.

لحسن الحظ ، مع القليل من التعليمات البرمجية وموافقة المستخدم ، يمكننا تنزيل مكونات WordPress الإضافية وتثبيتها وتنشيطها وإلغاء تنشيطها وحتى حذفها. يمكن لهذه العملية التلقائية ، عند نشرها بشكل مسؤول ، تحسين تجربة المستخدم بشكل كبير وزيادة معدلات التحويل لإجراءات المستخدم الضرورية في مسؤول WordPress.

من الصعب حمل المستخدمين على فعل أي شيء. فلماذا لا تقوم بتنزيل وتثبيت وتنشيط #WordPress plugins تلقائيًا؟ لا يتطلب الأمر سوى بضعة أسطر من التعليمات البرمجية.

انقر على تويتر

لماذا تقوم بتنزيل وتثبيت وتنشيط المكونات الإضافية عبر الكود؟

هناك العديد من السيناريوهات ولكن بغض النظر عن النظرية ، فلنلقِ نظرة على الموقف الذي تواجهه WP Reset. لقد كتبت بالفعل منشورًا حول إعادة تسمية العلامة التجارية reset-wp إلى WP Reset. إلى جانب أشياء أخرى ، تتضمن العملية الحصول على الأشخاص الذين يستخدمون بالفعل إعادة تعيين wp لإزالته من مواقعهم ثم تثبيت WP Reset. لماذا شخص ما يفعل ذلك فقط لأننا سألنا؟ وحتى لو أرادوا القيام بذلك ، فسيكونون مترددين لأنه بعيد عن النقرتين. ومع ذلك ، إذا شرحنا كل شيء وقمنا باختصاره إلى زر واحد "نعم ، المضي قدمًا ، واستبدل reset-wp بـ Reset WP" ، فلن تبدو الأمور بهذا السوء.

لا تعبث بمواقع الأشخاص دون إذنهم! فترة. ولا حتى لو كان "شيئًا صغيرًا جدًا." هذا غير لائق. إنه ليس موقعك. أبلغ المستخدمين بأي تغييرات عند تحديث المكون الإضافي أو عند إضافة ميزات جديدة.

نظرًا لقواعد wp.org التي تمنعنا من تتبع إجراءات المستخدم (بدون موافقتهم ، ولم نرغب في إزعاجهم بالسؤال) ، للأسف ، ليس لدي أي أرقام لمشاركتها. ولكن ما يمكنني قوله هو أنه ليس لدينا أي شكاوى من مستخدمي إعادة تعيين wp الذين خضعوا لعملية الاستبدال ، أو شاهدوا الإشعار في المكون الإضافي. ونحن نجري هذه العملية لأكثر من سبعة أسابيع.

هل هو موافق للقيام بذلك؟ هل يمانع المستخدمون؟

سيهتم المستخدمون بالتأكيد بأي شيء وكل ما تفعله وراء ظهورهم! لا تفعل ذلك! لا تفعل أي شيء دون إذن المستخدمين. خاصة إذا تمت استضافة المكون الإضافي على wp.org لأن هذا مخالف للقواعد. إذا قمت بذلك ، فسيقوم المسؤولون على الفور بإزالة المكون الإضافي الخاص بك من المستودع.

ولكن ، إذا طلبت الإذن - "هل يمكننا استبدال المكوّن الإضافي أ بالمكوِّن الإضافي ب؟ يرجى تأكيد." ثم لا بأس من القيام بذلك. تستغرق عملية إلغاء تنشيط أحد المكونات الإضافية وحذفها وتنزيل مكون إضافي وتنشيطه أكثر من بضع نقرات. لذلك ، إذا تمكنت من أتمتة هذه العملية ، وتقليلها إلى نقرة واحدة ، فسيكون من دواعي سرور المستخدمين.

كانت هناك عملية مماثلة لتنشيط المكونات الإضافية المطلوبة للقوالب قيد التشغيل لسنوات ، والمستخدمون على ما يرام معها. بدلاً من اتباع روابط متعددة لتثبيت المكونات الإضافية ، يؤكدون أنهم موافقون على العملية ويتم تثبيت العديد من المكونات الإضافية بنقرة واحدة.

كالعادة ، هناك حاجة إلى القليل جدًا من التعليمات البرمجية

في الكود الزائف ، هذه هي الفكرة العامة لما نريد القيام به:

// pseudo code only!
// DO NOT copy & paste

var $old_plugin;
var $new_plugin;

if ( is_plugin_installed( $new_plugin ) ) {
  // new plugin is already installed
  // make sure we have the last version
  upgrade_plugin( $new_plugin );
} else {
  install_plugin( $new_plugin );
}

if ( !is_plugin_active( $new_plugin ) ) {
  // new plugin is not active - activate it
  activate_plugin( $new_plugin );
}

// deactivate old plugin
deactivate_plugin( $old_plugin );

// if needed delete old plugin
delete_plugin( $old_plugin );

// pseudo code only!
// DO NOT copy & paste

الأمر بسيط للغاية ومباشر. طالما أن المستخدم لديه أذونات الملف الصحيحة ، فاضبط كل شيء بسلاسة. لا يستغرق الاستبدال بالكامل أكثر من ثانية أو ثانيتين حتى يكتمل.

نحن بحاجة إلى بعض الوظائف

لحسن الحظ ، يحتوي WordPress على معظم الوظائف التي نحتاجها إما منجزة أو شبه منتهية ، لذا فإن الأمر يتعلق بتجميع الأشياء معًا.

المفهوم الأساسي الذي يجب فهمه هو كيفية تحديد WordPress للمكوِّن الإضافي ، وكيف يعرف أي مكون إضافي. يقوم بذلك عن طريق plugin slug - مزيج من اسم مجلد البرنامج المساعد وملف PHP الرئيسي. على سبيل المثال: hello-dolly / hello-dolly.php. ملف PHP الرئيسي هو الملف برؤوس البرنامج المساعد. للحصول على slug ، قم بتشغيل plugin_basename( __FILE__ ) . عندما يتعين عليك التحقق مما إذا كان المكون الإضافي نشطًا أو تريد القيام بشيء ما به ، فأنت بحاجة إلى استخدام سبيكة المكون الإضافي. هذا الرابط مشابه ولكنه ليس مثل سبيكة من wp.org. في المستودع ، الرابط الثابت هو اسم المجلد فقط ، بدون اسم الملف. لذا ، بالنسبة لـ Hello Dolly ، إنها "hello-dolly". لسنا بحاجة إلى ذلك في الوقت الحالي ، لكن يجب توضيحه. للحصول على قراءة أكثر تعمقًا حول هذا الموضوع المربك إلى حد ما ، راجع هذا الموضوع على Stack Exchange.

يحدد WordPress المكونات الإضافية من خلال slug ، مثل hello-dolly / hello-dolly.php. للحصول على slug ، قم بتشغيل plugin_basename( __FILE__ ) في الملف الرئيسي للمكون الإضافي.

is_plugin_active( $plugin_slug ) مدمجًا لذا لا يوجد شيء نقوم به. صفحة المخطوطة لا تكشف الكثير ، إنها وظيفة بسيطة.

is_plugin_installed( $plugin_slug ) لا يأتي مدمجًا ، لكنه مجرد بضعة أسطر للتشفير.

function is_plugin_installed( $slug ) {
  if ( ! function_exists( 'get_plugins' ) ) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }
  $all_plugins = get_plugins();
  
  if ( !empty( $all_plugins[$slug] ) ) {
    return true;
  } else {
    return false;
  }
}

هذه هي جميع وظائف الاختبار الشرطية التي نحتاجها. الآن لأولئك الذين يفعلون شيئًا ما. activate_plugin( ) مضمن وله أربع معاملات ، لذا تحقق من صفحة Codex حول هذا الموضوع.

deactivate_plugins( $plugin_slug ) متاح أيضًا خارج الصندوق ولكن تأكد من تدوين "s" (الجمع) في اسم الوظائف. يحتوي أيضًا على عدد قليل من المعلمات ، لذا اقرأ صفحة الدستور الغذائي.

install_plugin( $plugin_zip ) كجزء من فئة Plugin_Upgrader . لا حاجة لأي كود إضافي ، فقط نسخة صفية جديدة. الشيء نفسه ينطبق على upgrade_plugin( $plugin_slug ) .

function install_plugin( $plugin_zip ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();

  $upgrader = new Plugin_Upgrader();
  $installed = $upgrader->install( $plugin_zip );

  return $installed;
}

function upgrade_plugin( $plugin_slug ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();

  $upgrader = new Plugin_Upgrader();
  $upgraded = $upgrader->upgrade( $plugin_slug );

  return $upgraded;
}

قد لا تكون هناك حاجة إلى wp_cache_flush() ولكني أضفته فقط لأكون في الجانب الآمن. إلى جانب الأشياء التي تستغرق 10 مللي ثانية لتشغيلها ، لا يمكن أن تسبب أي ضرر.

ضع كل شيء معا

إذا كنت تقرأ هذه المقالة ليس من باب الفضول ، ولكن بدافع الحاجة الحقيقية إلى تنفيذ الكود في مكون إضافي ، أقترح بشدة تثبيت المكون الإضافي reset-wp. القراءة عن الكود أمر رائع ، لكن لا شيء يضاهي الاختبار في البرية.

أفضّل استخدام admin_action تقريبًا لكل شيء لا يحتاج إلى واجهة مستخدم رسومية كاملة للمسؤول. لذا ، أضف هذا إلى الوظيفة حيث تتم إضافة الإجراءات والمرشحات الأخرى: add_action( 'admin_action_replace_plugin', 'replace_plugin' ); . عندما يفتح المستخدم admin.php؟ action = replace_plugin سيتم تشغيل الكود الخاص بنا. من فضلك لا hardcode هذا URL. استخدم شيئًا مثل: $url = add_query_arg(array('action' => 'replace_plugin'), admin_url('admin.php')); . يتحدث الكثير عن جودة التعليمات البرمجية الخاصة بك.

إليك الكود الذي يمكنك نسخه / لصقه. من الواضح ، قم بتعديل المتغيرات الثلاثة في الأعلى بقيمك.

function replace_plugin() {
  // modify these variables with your new/old plugin values
  $plugin_slug = 'wp-reset/wp-reset.php';
  $plugin_zip = 'https://downloads.wordpress.org/plugin/wp-reset.latest-stable.zip';
  $old_plugin_slug = 'reset-wp/reset-wp.php';
  
  echo 'If things are not done in a minute <a href="plugins.php">click here to return to Plugins page</a><br><br>';
  echo 'Starting ...<br><br>';
  
  echo 'Check if new plugin is already installed - ';
  if ( is_plugin_installed( $plugin_slug ) ) {
    echo 'it\'s installed! Making sure it\'s the latest version.';
    upgrade_plugin( $plugin_slug );
    $installed = true;
  } else {
    echo 'it\'s not installed. Installing.';
    $installed = install_plugin( $plugin_zip );
  }
  
  if ( !is_wp_error( $installed ) && $installed ) {
    echo 'Activating new plugin.';
    $activate = activate_plugin( $plugin_slug );
    
    if ( is_null($activate) ) {
      echo '<br>Deactivating old plugin.<br>';
      deactivate_plugins( array( $old_plugin_slug ) );
      
      echo '<br>Done! Everything went smooth.';
    }
  } else {
    echo 'Could not install the new plugin.';
  }
}
  
function is_plugin_installed( $slug ) {
  if ( ! function_exists( 'get_plugins' ) ) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }
  $all_plugins = get_plugins();
  
  if ( !empty( $all_plugins[$slug] ) ) {
    return true;
  } else {
    return false;
  }
}

function install_plugin( $plugin_zip ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();
  
  $upgrader = new Plugin_Upgrader();
  $installed = $upgrader->install( $plugin_zip );

  return $installed;
}

function upgrade_plugin( $plugin_slug ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();
  
  $upgrader = new Plugin_Upgrader();
  $upgraded = $upgrader->upgrade( $plugin_slug );

  return $upgraded;
}

يستخدم الكود كل شيء ناقشناه بالفعل. تعد واجهة المستخدم الرسومية والرسائل أساسية جدًا ، لذا أضف القليل من CSS أو قم بتحميل عنوان URL في Lightbox كما فعلنا في reset-wp.

يعد إجراء المهام العادية المملة تلقائيًا للمستخدمين دائمًا إضافة كبيرة لـ #UX. تعرف على كيفية تنزيل وتثبيت وتنشيط عدة إضافات #WordPress بنقرة واحدة.

انقر على تويتر

نقرة واحدة دائما أفضل من عشرة

يعد جعل المستخدمين ينقرون مرة واحدة بدلاً من عشر مرات أمرًا إيجابيًا دائمًا! إنها علامة على تجربة مستخدم جيدة (تجربة مستخدم). لذلك إذا كان المكون الإضافي أو السمة الخاصة بك تتطلب مكونات إضافية أخرى ، فإنني أوصي بتنفيذ إجراء التثبيت بنقرة واحدة لجميع التبعيات. ستحصل بلا شك على عدد أقل من تذاكر الدعم من الأشخاص في المراحل الأولى من استخدام البرنامج المساعد.

بالنسبة لاستبدال مكون إضافي بآخر - حاول الابتعاد عن تلك المواقف. في بعض الأحيان يكون هذا أمرًا لا مفر منه ، ولكن المشكلة هي أنك لن تجعل جميع المستخدمين ينتقلون إلى المكون الإضافي الجديد ، مما يعني أنه يتعين عليك إما دعم مكونين إضافيين أو التخلي عن جزء من قاعدة المستخدمين الخاصة بك الذي يستمر في استخدام المكون الإضافي القديم وإحباطه. نواجه نفس القرار مع reset-wp ولا نحب أيًا من هذين الحلين