วิธีที่ดีที่สุดในการยกเลิกปลั๊กอินในกรณีที่มีเวอร์ชัน PHP ไม่เพียงพอ


15

คุณเขียนปลั๊กอินที่ต้องการ PHP 5.1 มีคนพยายามติดตั้งบนเซิร์ฟเวอร์ที่มี PHP 4 คุณจัดการกับมันอย่างไรในลักษณะที่ปลอดภัยและใช้งานง่าย


ทำไมคุณต้องการมัน WP ไม่ทำงานบน PHP <5 อีกต่อไป
onetrickpony

มันเป็นคำถามทั่วไป คุณอาจต้องการเวอร์ชั่น PHP ที่สูงกว่านี้ ที่ถูกกล่าวว่าผมไม่ทราบPHP 5.2.4 จะต้องตั้งแต่ WP 3.2
Geert

2
สำหรับผู้ที่กำลังมองหาข้อกำหนด PHP ของปลั๊กอินที่มีอยู่แล้วโปรดช่วยให้ผู้ใช้ปัจจุบันของคุณโปรดปรานโดยป้องกันไม่ให้อัปเดตเป็นเวอร์ชันใหม่หากไม่ตรงตามข้อกำหนด เช่นจาก BuddyPress ต้องใช้การเตรียมการบางอย่างในปลั๊กอินรุ่นก่อนหน้าของคุณ แต่ผู้ใช้ของคุณจะขอบคุณ ฉันเพิ่งทำสิ่งที่คล้ายกันใน WordPointsในกรณีที่ฉันตัดสินใจทำข้อกำหนด PHP ในอนาคต
JD

คำตอบ:


15

ฟังก์ชั่นและฮุกการเปิดใช้งานป้องกันปลั๊กอินจากการเปิดใช้งานและช่วยให้คุณตรวจสอบทั้ง PHP และ WordPress ขั้นต่ำ

register_activation_hook( __FILE__, array( 'Your_Plugin_Class_Name', 'activate' ) );

/**
  * Plugin Activation hook function to check for Minimum PHP and WordPress versions
  * @param string $wp Minimum version of WordPress required for this plugin
  * @param string $php Minimum version of PHP required for this plugin
  */
 function activate( $wp = '3.1', $php = '5.2.4' ) {
    global $wp_version;
    if ( version_compare( PHP_VERSION, $php, '<' ) )
        $flag = 'PHP';
    elseif
        ( version_compare( $wp_version, $wp, '<' ) )
        $flag = 'WordPress';
    else
        return;
    $version = 'PHP' == $flag ? $php : $wp;
    deactivate_plugins( basename( __FILE__ ) );
    wp_die('<p>The <strong>Insert PLugin Name Here</strong> plugin requires'.$flag.'  version '.$version.' or greater.</p>','Plugin Activation Error',  array( 'response'=>200, 'back_link'=>TRUE ) );
}

สิ่งนี้จะไม่ทำงานหากมีการเปลี่ยนแปลงไวยากรณ์ของ php ทำให้ไฟล์ php ไม่สามารถทำการแยกวิเคราะห์ได้เลย
Mark Kaplun

10
/**
 * Plugin Name: Foo
 */

// Check for required PHP version
if ( version_compare( PHP_VERSION, '5.1', '<' ) )
{
    exit( sprintf( 'Foo requires PHP 5.1 or higher. You’re still on %s.', PHP_VERSION ) );
}

// The rest of your plugin code follows

ฉันไม่แน่ใจตั้งแต่เกิด WP รุ่นนี้ขึ้น แต่ใน 3.5 ปลั๊กอินไม่สามารถเปิดใช้งานได้จริงและข้อความแสดงข้อผิดพลาดจะปรากฏต่อผู้ใช้ในผู้ดูแลระบบซึ่งเรียบร้อย

แม้ว่าข้อความแสดงข้อผิดพลาดจะไม่ได้รับการแปล ในการทำเช่นนั้นคุณจะต้องโหลดไฟล์แปลก่อนการexitโทร


ฉันคิดว่าฉันยังคงต้องการวิธีนี้สำหรับความเรียบง่ายของมัน นอกจากนี้ยังไม่เคยติดตั้งปลั๊กอินดังนั้นจึงไม่จำเป็นต้องเรียกรูทีนการยกเลิกการติดตั้งในกรณีที่ PHP เวอร์ชันเก่าเกินไป
Geert

6

คุณสามารถเปิดใช้งานและแสดงข้อความข้อผิดพลาด:

// if PHP version is lower than 5.1
if(version_compare(PHP_VERSION, '5.1') < 0){

  // show a message inside the dashboard
  if(is_admin()){

    function my_plugin_notice(){      
      ?>
      <div class="error below-h2">
        <p>
        <?php
          printf(__('The abc plugin requires at least PHP 5.1. You have %s'), PHP_VERSION);
         ?>
        </p>
      </div>
      <?php
    }

    add_action('admin_notices', 'my_plugin_notice');

  }

  // stop here and do nothing further
  return;  
}

// if PHP version is equal or higher than 5.1
require dirname(__FILE__) . '/php51code.php';

นอกจากนี้ยังอาจเป็นไปได้ที่จะปิดการใช้งานโดยทางโปรแกรมก่อนที่จะส่งคืนข้อความ ...


ใช่คุณยังคงต้องปิดการใช้งานโดยทางโปรแกรมหากคุณใช้การตั้งค่านี้เพราะแม้จะมีประกาศของผู้ดูแลระบบปลั๊กอินจะปรากฏขึ้นเมื่อเปิดใช้งาน
Geert


1
ฟังก์ชั่นversion_compareมีพารามิเตอร์ที่สามสำหรับการเปรียบเทียบ โปรดใช้if ( version_compare( phpversion(), '5.1a', '<' ) )
bueltge

1
จำเป็นต้องใช้เฉพาะเมื่อคุณต้องการให้ฟังก์ชันนี้ส่งคืนบูลีน
onetrickpony

แต่ค่าบูลีนจะเร็วกว่าเมื่อเปรียบเทียบกับค่าจำนวนเต็ม 0
bueltge

0

ฉันรู้ว่านี่เป็นคำถามที่เก่ากว่า แต่สำหรับผู้ที่กำลังมองหาทางออกที่ดี Gary Pendergast มีเส้นทางที่ดีที่จะครอบคลุมบางส่วนของฐานที่กล่าวถึงในคำตอบอื่น ๆ (ดูโพสต์ของเขาที่นี่ฉันได้อัปเดตโค้ดด้านล่าง เพื่อตรวจสอบเวอร์ชั่น PHP แต่คุณสามารถใช้ได้กับการตรวจสอบใด ๆ ):

//  In this example, only allow activation on WordPress 3.7 or higherclass 
MyPlugin {
function __construct() {
    add_action( 'admin_init', array( $this, 'check_version' ) );

    // Don't run anything else in the plugin, if we're on an incompatible WordPress version
    if ( ! self::compatible_version() ) {
        return;
    }
}

// The primary sanity check, automatically disable the plugin on activation if it doesn't// meet minimum requirements.static
function activation_check() {
    if ( ! self::compatible_version() ) {
        deactivate_plugins( plugin_basename( __FILE__ ) );
        wp_die( __( 'My Plugin requires PHP 5.1 or higher!', 'my-plugin' ) );
    }
}

// The backup sanity check, in case the plugin is activated in a weird way,
// or the versions change after activation.
function check_version() {
    if ( ! self::compatible_version() ) {
        if ( is_plugin_active( plugin_basename( __FILE__ ) ) ) {
            deactivate_plugins( plugin_basename( __FILE__ ) );
            add_action( 'admin_notices', array( $this, 'disabled_notice' ) );

            if ( isset( $_GET['activate'] ) ) {
                unset( $_GET['activate'] );
            }
        }
    }
}

function disabled_notice() {
    echo '<strong>' . esc_html__( 'My Plugin requires PHP 5.1 or higher!', 'my-plugin' ) . '</strong>';
}

static function compatible_version() {
    if ( version_compare(PHP_VERSION, '5.1', '<') ) {
        return false;
    }

    // Add sanity checks for other version requirements here

    return true;
}
}
global $myplugin;
$myplugin = new MyPlugin();
register_activation_hook( __FILE__, array( 'MyPlugin', 'activation_check' ) );

ผมเคยบันทึกไว้ยังโค้ดข้างต้นในส่วนสำคัญ


นี่มันอะไรกันเนี่ย!
Andrei Surdu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.