ปลั๊กอิน Wordpress Update ตะขอ / การกระทำ? ตั้งแต่ 3.9


15

ฉันได้ทำการวิจัยนี้สองสามครั้งแล้ว แต่การค้นหาของฉันไม่ได้เปิดเผยอะไรมากนอกจากรหัสที่กำหนดเองซึ่งอาจจะเป็นแบบฝึกหัด WordPress ที่ดีหรือไม่ดีก็ได้

ในฐานะของรุ่นล่าสุด (WordPress 3.9 "สมิ ธ ") มีการเพิ่มเบ็ดเข้าไปในกระบวนการอัปเดตปลั๊กอินหรือไม่? ฉันถามเพราะมันเป็นความต้องการขั้นพื้นฐานมาก แต่ฉันไม่เห็นมันเพิ่มไปยัง codex (ยัง) ถ้าไม่นักพัฒนาทั่วไปและผู้ปฏิบัติงานที่ดีที่สุดจ้างอะไร

แก้ไข: เพื่อชี้แจงฉันไม่ได้พูดถึงการเปิดใช้งาน แต่เกี่ยวกับการอัปเดตด้วยวิธีนี้หากมีการเปลี่ยนแปลงในฐานข้อมูลหรืออาจแก้ไขได้



@drzaus คำตอบหากไม่มีวิธีปฏิบัติที่ดี
Rens Tillmann

@RensTillmann นอกเหนือจากนี้เป็น 2 ปีแล้วคำถาม / คำตอบที่เชื่อมโยงนั้นมีคำตอบเดียวกันโดยทั่วไป แต่มีมาก่อนคำถามนี้อีก 2 ปีดังนั้น 'ซ้ำ'
drzaus

คำตอบ:


16

ฉันไม่คิดว่ามีการเพิ่มการกระทำ คุณสามารถดูรายละเอียดเวอร์ชันของเวอร์ชันใดก็ได้และดูการกระทำใหม่ที่เพิ่มเข้ามา

วิธี WordPress เพื่อเรียกใช้รหัสในการปรับปรุงปลั๊กอินคือสิ่งที่อธิบายไว้ที่นี่ :

วิธีที่เหมาะสมในการจัดการพา ธ การอัพเกรดคือการรันโพรซีเดอร์การอัพเกรดเมื่อคุณต้องการเท่านั้น เป็นการดีที่คุณจะเก็บ "รุ่น" ในตัวเลือกฐานข้อมูลของปลั๊กอินแล้วรุ่นในรหัส หากไม่ตรงกันคุณจะดำเนินการตามขั้นตอนการอัปเกรดแล้วตั้งค่าตัวเลือกฐานข้อมูลให้เท่ากับรุ่นในรหัส นี่คือจำนวนปลั๊กอินที่จัดการกับการอัพเกรดและนี่คือวิธีการทำงานของคอร์เช่นกัน

และมีตัวอย่างรหัสที่นี่ :

function myplugin_update_db_check() {
    global $jal_db_version;
    if (get_site_option( 'jal_db_version' ) != $jal_db_version) {
        jal_install();
    }
}
add_action( 'plugins_loaded', 'myplugin_update_db_check' );

ขอบคุณ - ฉันจะใช้วิธีการนั้นแล้ว WP ต้องเพิ่มการดำเนินการสำหรับสิ่งนี้: D
user1915665

8
ในทางเทคนิคคุณควรจะใช้register_activation_hookเนื่องจากในกรณีส่วนใหญ่ปลั๊กอินจะถูกปิด / เปิดใช้งานเมื่อใดก็ตามที่คุณอัปเดตจากผู้ดูแลระบบ การเชื่อมต่อplugins_loadedจะทำหน้าที่ตรวจสอบการโหลดทุกหน้าของคุณ (รวมถึงส่วนหน้า) มีการพูดคุยเกี่ยวกับการแนะนำregister_update_hookแต่มันถูกทำเครื่องหมายเป็น WONTFIXเมื่อไม่นานมานี้ การอภิปรายมีประโยชน์
drzaus

4
สิ่งสำคัญคือต้องเข้าใจว่าการอัปเดตปลั๊กอินจำนวนมากไม่เรียกใช้ hooks การเปิดใช้งาน แต่ควรใช้ แต่ไม่ได้อยู่ที่ 3.9.2 โดย "การอัปเดตจำนวนมาก" ฉันหมายถึงการอัปเดตที่ทำจากหน้าอัปเดตแผงควบคุม การอัปเดตส่วนบุคคลที่ทำจากภายในหน้าปลั๊กอินเรียกใช้ hooks ได้ดี
Brian C

4
สิ่งที่เป็นปลั๊กอินสามารถอัปเดตผ่าน FTP ซึ่งหมายความว่าเบ็ดจะไม่ถูกไล่ออกในกรณีใด ๆ นั่นเป็นเหตุผลที่คุณต้องหันไปใช้ตัวเลือกที่เก็บไว้ในฐานข้อมูล
giraff

4
หากต้องการขยายความคิดเห็นของ @ giraff สิ่งเดียวกันนี้เป็นจริงสำหรับผู้ที่จัดการรหัสของพวกเขาด้วยการควบคุมซอร์สเช่น SVN หรือ Git ด้วยเหตุนี้คำตอบนี้เป็นวิธีที่ดีที่สุดในการจัดการกับการอัพเกรด
doublesharp

3

จากการสนทนาที่พวกเขาตัดสินใจที่จะไม่เพิ่มตะขอ / ฟังก์ชั่นที่กำหนดเองเฉพาะเพื่ออัพเกรดดูเหมือนว่าจะใช้ "คนส่วนใหญ่" (ราว 4 ปีก่อน) register_activation_hookเนื่องจากมันถูกเรียกเมื่อมีการอัพเกรดปลั๊กอินผ่านหน้าผู้ดูแลระบบ ตัวอย่างส่วนใหญ่ที่ฉันเห็นตั้งแต่นั้นมาตามแนวโน้มนั้น

สำหรับการใช้งานส่วนใหญ่ฉันจะแนะนำไม่ขอผ่านplugins_loadedเพราะมันจะถูกเรียกในทุก ๆ หน้าโหลด มีการกล่าวถึงข้อยกเว้นนี้ในการอภิปราย: เส้นทางการอัปเกรดผ่าน FTP / SVN คือ 'edge cases' เนื่องจาก WP จะไม่มีกลไกที่จะรู้ว่าปลั๊กอินนั้นถูกเปลี่ยนแปลงซึ่งในกรณีนี้คำตอบก่อนหน้านี้อาจมีความเกี่ยวข้องมากกว่า

ดูhttps://gist.github.com/zaus/c08288c68b7f487193d1สำหรับกรอบง่าย register_activation_hook'ตัวอย่างการใช้


register_activation_hookไม่รับประกันว่าจะสามารถใช้งานกับการอัปเดตได้ที่make.wordpress.org/core/2010/10/27/…
Flimm

มาก - อย่าใช้plugins_loaded- รันทุกภาระและอาจเป็นภาระ / ช้า
random_user_name

3

ตั้งแต่ WordPress 3.9 คุณสามารถใช้upgrader_process_completeเบ็ด
ดูข้อมูลอ้างอิง1 , 2

นี่คือตัวอย่างรหัส:

<?php 
/**
 * Plugin Name: Test plugin 1
 * Plugin URI: http://rundiz.com
 * Description: A very simple plugin for testing. This plugin do nothing.
 * Version: 0.1.8
 * Author: Vee Winch
 * Author URI: http://rundiz.com
 * License: MIT
 * License URI: https://opensource.org/licenses/MIT
 * Text Domain: test-plugin1
 * Domain Path: 
 */


$wppstp1_version = '0.1.8';


add_action('upgrader_process_complete', 'wppstp1_upgrade', 10, 2);// will working only this plugin activated.
function wppstp1_upgrade(\WP_Upgrader $upgrader_object, $hook_extra)
{
    global $wppstp1_version;

    if (is_array($hook_extra) && array_key_exists('action', $hook_extra) && array_key_exists('type', $hook_extra) && array_key_exists('plugins', $hook_extra)) {
        // check first that array contain required keys to prevent undefined index error.
        if ($hook_extra['action'] == 'update' && $hook_extra['type'] == 'plugin' && is_array($hook_extra['plugins']) && !empty($hook_extra['plugins'])) {
            // if this action is update plugin.
            $this_plugin = plugin_basename(__FILE__);

            foreach ($hook_extra['plugins'] as $each_plugin) {
                if ($each_plugin == $this_plugin) {
                    // if this plugin is in the updated plugins.
                    // don't process anything from new version of code here, because it will work on old version of the plugin.
                    file_put_contents(WP_CONTENT_DIR . '/test.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND); // you will always get the previous version even you update to the new version.
                    // set transient to let it run later.
                    set_transient('wppstp1_updated', 1);
                }
            }// endforeach;
            unset($each_plugin);
        }// endif update plugin and plugins not empty.
    }// endif; $hook_extra
}// wppstp1_upgrade


add_action('plugins_loaded', 'wppstp1_runUpdatedPlugin');
function wppstp1_runUpdatedPlugin()
{
    global $wppstp1_version;

    if (get_transient('wppstp1_updated') && current_user_can('manage_options')) {
        // if plugin updated and current user is admin.
        file_put_contents(WP_CONTENT_DIR . '/test-update-by-transient.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND);// you will always get the updated version here.

        // update code here.

        // delete transient.
        delete_transient('wppstp1_updated');
    }
}// wppstp1_runUpdatedPlugin

เมื่ออัปเดตปลั๊กอินแล้วมันจะตั้งค่างานเป็น db โดยใช้set_transient()ฟังก์ชั่น ไม่แนะนำให้เพิ่มรหัสอัพเดทในขณะที่โทรหาupgrader_process_completehook
ถัดไปหากคุณเรียกดูหน้าผู้ดูแลระบบคนอื่น ๆplugins_loadedhook จะใช้งานได้และรหัสการอัปเดตจะทำงานที่นั่น

โปรดทราบว่าปลั๊กอินนี้จะต้องเปิดใช้งานเพื่อให้เบ็ดการอัปเดตทำงานได้
สิ่งนี้ไม่ทำงานในการเปิดใช้งานปลั๊กอินดังนั้นหากคุณต้องการรหัสที่ใช้งานได้กับการเปิดใช้งานปลั๊กอินที่คุณต้องใช้รหัสในการregister_activation_hook()ทำงาน

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