Làm cách nào tôi có thể ngăn plugin cập nhật trừ khi đáp ứng phiên bản PHP tối thiểu?


7

Tôi có một plugin được phân phối trên WordPress.org khá phổ biến. Tôi phải bỏ hỗ trợ cho PHP 5.2 và tôi muốn giảm ít nhất hỗ trợ cho PHP 5.2, nhưng nếu tôi có thể tạo PHP tối thiểu 5.4, các ràng buộc tĩnh muộn và các bao đóng hữu ích, sẽ rất tuyệt.

Trước khi bạn nói PHP7, hãy nhớ rằng plugin chỉ có hơn 100.000 trang web đang chạy nó. Đối với tất cả các trang web WordPress , 10% cho các trang web nằm trên PHP 5.3 trở xuống. Tôi không mạo hiểm phá vỡ các trang web 10k.

Chúng tôi sẽ thêm tiêu đề phiên bản tối thiểu PHP , nhưng ở cấp độ lập trình này, chưa làm gì cả.

Tôi đang tìm kiếm mẫu phù hợp để cập nhật ngắn gọn các plugin của mình trừ khi yêu cầu phiên bản PHP được đặt. Có ai có một cách chống đạn để làm điều này?

Câu trả lời:


3

Tại thời điểm này, điều này là không thể. Không phải không có tiêu đề phiên bản tối thiểu PHP đang được thực hiện.

Khi điều đó được thực hiện, sau đó nó sẽ có thể. Cho đến lúc đó, bạn không thể tự làm thông qua mã plugin.

Về lý thuyết, bạn có thể phát hành bản cập nhật sẽ chặn các bản cập nhật trong tương lai cho một plugin đó nếu phiên bản PHP không được đáp ứng, nhưng ngay cả điều đó sẽ không ngăn plugin của bạn nhận được bản cập nhật khi nó không hoạt động. Vì vậy, không thể thực hiện được vì các cập nhật plugin được thực hiện bởi WordPress chứ không phải bởi chính các plugin.


Nhưng nếu plugin không hoạt động, các bản cập nhật sẽ không gây ra sự cố cho đến khi nó được kích hoạt. Đúng? Vì vậy, anh ta không thể sử dụng hook kích hoạt plugin chỉ với 5,2 mã, kiểm tra phiên bản và nếu nó không tương thích thì tắt plugin với thông báo của quản trị viên?
Nathan Johnson

2
Tự làm điều đó là hơi sớm khi công việc đang hoạt động được thực hiện để cả việc kiểm tra như vậy vào lõi, cũng như có thể sửa đổi các API để ngăn các bản cập nhật không tương thích được gửi đến người dùng. Đây là một vấn đề đang được tích cực làm việc, không cần phải nhảy súng. :)
Otto

0

F ** k Luddites;)

Mặc dù không trả lời trực tiếp câu hỏi, nhưng kinh nghiệm của riêng tôi khi chuyển một plugin bán phổ biến từ 5.2 sang 5.3 là có ít ma sát hơn bạn mong đợi khi nhìn vào số liệu thống kê sử dụng của wordpress.org và những ma sát đó thường dễ dàng được xử lý bởi chủ sở hữu trang web.

Và tất nhiên những người thay đổi trực tiếp trên các trang sản xuất, chỉ xứng đáng với bất cứ điều gì họ nhận được;)

Theo một cách nào đó, trừ khi bạn có thể hiển thị một thông báo nổi bật về sự không tương thích, bạn sẽ làm tổn thương người dùng nhiều hơn sau đó giúp họ, vì không có thông báo như vậy, họ không có cách nào để khuyến khích nâng cấp môi trường máy chủ của họ và sẽ không biết họ sẽ không bao giờ có được các tính năng mới hoặc cập nhật bảo mật.


0

Tôi nghĩ rằng nó có thể được thực hiện.

Tôi sử dụng quy trình này để kiểm tra phiên bản tối thiểu khi kích hoạt plugin. Bạn có thể sử dụng một biến thể trên này để kiểm tra trong quá trình nâng cấp (mặc dù tôi nghĩ rằng việc nâng cấp lên phiên bản mới có chứa mã này sẽ khiến plugin ngừng kích hoạt).

Mã để kiểm tra các phiên bản tối thiểu:

function is_requirements_met()
{
    $min_wp = '4.6' ; // minimum WP version
    $min_php = '5.3' ; // minimum PHP version
    // Check for WordPress version
    if ( version_compare( get_bloginfo('version'), $min_wp, '<' ))
    {
        return false ;
    }
    // Check the PHP version
    if ( version_compare(PHP_VERSION, $min_php, '<'))
    {
        return false ;
    }
    return true ;
}

.... và sau đó điều này để vô hiệu hóa plugin nếu các phiên bản không phù hợp với yêu cầu (hàm trả về sai)

if ( is_plugin_active( plugin_basename(__FILE__)))
    {
        deactivate_plugins( plugin_basename(__FILE__)) ;
        // Hide the default "Plugin activated" notice
        if ( isset ($_GET['activate']))
        {
            unset ($_GET['activate']) ;
        }
    }

Sau đó, tôi hiển thị một thông báo quản trị để cho họ biết plugin đã bị vô hiệu hóa:

add_action('admin_notices', 'show_notice') ;

Trường hợp show_noticechức năng hiển thị một thông báo quản trị viên có thể bỏ qua.

function show_notice()
{
    echo '<div class="notice notice-error is-dismissible"><h3><strong>Plugin </strong></h3><p> cannot be activated - requires at least WordPress 4.6 and PHP 5.3.&nbsp;&nbsp;&nbsp;Plugin automatically deactivated.</p></div>' ;
    return ;
}

Hoạt động tốt.

Chỉnh sửa để thêm

Điều gì sẽ xảy ra nếu bạn đặt mã trong plugin của mình để chặn nâng cấp plugin (đại loại như thế này: /programming/17897044/wordpress-how-to-disable-plugin-update ).

Phiên bản mới của plugin có sơ khai tải trước. Nó sẽ kiểm tra phiên bản PHP. Nếu OK, tải phần còn lại của plugin. Nếu không, đừng tải phần còn lại của plugin. Mã trong sơ khai tải trước sẽ hoạt động trong tất cả các phiên bản PHP.

Sơ khai không chứa bất kỳ mã PHP 7x nào, vì vậy tiền xử lý sơ khai sẽ không gây ra lỗi. Sơ khai cũng sẽ vô hiệu hóa plugin bằng cách sử dụng một cái gì đó tương tự như câu trả lời ban đầu của tôi.

Nếu phiên bản PHP là 7x, thì sơ khai tải trước sẽ tải phần còn lại của plugin. Và Bob là chú của bạn.


nếu plugin được viết (vì mục đích tranh luận) trong PHP 7.2, sử dụng các tính năng ngôn ngữ mới, nhiều khả năng nó sẽ đánh sập trang web trước khi phát ra bất kỳ thông báo nào. Nếu bạn đang đi theo cách đó bạn sẽ chết khi kích hoạt, nhưng hơn một lần nữa, hook kích hoạt hoàn toàn không được thực hiện khi nâng cấp plugin.
Đánh dấu Kaplun

Phần nào trong mã mẫu của tôi 'có khả năng đánh sập trang web trước khi phát ra bất kỳ thông báo nào'? Lưu ý rằng đây chỉ là các đoạn mã, chúng không hiển thị phần nào của mã plugin. Tôi sẽ đồng ý rằng chúng không được viết cho nhiều ngôn ngữ. Và tôi đã đề cập rằng tôi không chắc chắn liệu mã có được gọi khi nâng cấp hay không và có thể sử dụng 'biến thể của mã để kiểm tra trong quá trình nâng cấp'.
Rick Hellewell

... và mặc dù mã có thể không được chạy trong quá trình nâng cấp, tôi tin rằng nó sẽ được chạy trong lần tải trang quản trị tiếp theo.
Rick Hellewell

mã của bạn không cần phải sập, nhưng các phần khác của plugin sử dụng cú pháp cụ thể 7.2 sẽ khiến trình thông dịch php bị sập. Hãy nói rằng bạn có trình xử lý init sử dụng cú pháp 7.2, nó sẽ được chạy tại init và làm sập hệ thống và điều đó sẽ xảy ra trước khi thông báo được hiển thị
Mark Kaplun

Xem thêm thông tin câu trả lời. Quá trình đó có thể hoạt động để cho phép plugin yêu cầu PHP7.2 mà không phá vỡ các trang web không có 7.2.
Rick Hellewell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.