워드 프레스 업데이트 플러그인 훅 / 액션? 3.9 이후


15

나는 이것을 몇 번 연구했지만, 검색하면 좋은 WordPress 연습이 아닐 수도있는 사용자 정의 코드를 제외하고는 많이 드러나지 않습니다.

최신 릴리스 (WordPress 3.9 "Smith") 부터 플러그인 업데이트 프로세스에 후크가 추가 되었습니까? 매우 기본적인 요구 때문에 묻고 있지만 아직 코덱에 추가 된 것을 보지 못했습니다. 그렇지 않은 경우 개발자가 사용하는 일반적인 모범 사례는 무엇입니까?

편집 : 명확히하기 위해, 활성화에 대해 이야기하는 것이 아니라 데이터베이스에 변경 사항이 있거나 그렇지 않으면 해결 될 수있는 방식으로 업데이트에 대해 이야기하고 있습니다.



@ drzaus 답변은 좋은 습관이 없다면 제공됩니다.
Rens Tillmann

@RensTillmann은 어쨌든 2 년이 지난이를 제외하고는 연결된 q / a는 기본적으로 동일한 대답을하지만이 질문은 다른 2 년 전에 시작되므로 '중복'입니다.
drzaus

답변:


16

액션이 추가 된 것 같지 않습니다. 당신은 수있는 버전 정보를 보면 모든 버전과 추가 된 새로운 작업을 참조하십시오.

플러그인 업데이트시 코드를 실행하는 WordPress Way는 다음과 같습니다 .

업그레이드 경로를 처리하는 올바른 방법은 필요할 때만 업그레이드 절차를 실행하는 것입니다. 이상적으로는 플러그인의 데이터베이스 옵션에 "version"을 저장 한 다음 코드에 버전을 저장하는 것이 이상적입니다. 일치하지 않으면 업그레이드 절차를 시작한 다음 데이터베이스 옵션을 코드의 버전과 동일하게 설정하십시오. 이것이 업그레이드를 처리하는 플러그인의 수이며 코어의 작동 방식입니다.

코드 예제는 다음과 같습니다.

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' );

고맙습니다-그 방법을 사용하겠습니다. D : WP 정말이에 대한 작업 추가 할 수있다
user1915665

8
register_activation_hook대부분의 경우 관리자가 플러그인을 업데이트 할 때마다 플러그인이 비활성화 / 활성화되므로 기술적으로을 사용해야 합니다. 연결하면 plugins_loaded모든 페이지로드 (프론트 엔드 포함)를 확인합니다. 소개 register_update_hook에 대한 이야기가 있었지만 얼마 전 WONTFIX표시되었습니다 . 토론이 도움이됩니다.
drzaus

4
대량 플러그인 업데이트는 활성화 훅을 실행하지 않는다는 것을 이해해야합니다. 반드시 3.9.2는 아닙니다. "대량 업데이트"란 대시 보드 업데이트 페이지에서 수행 된 업데이트를 의미합니다. 플러그인 페이지에서 개별 업데이트를 수행하면 후크가 제대로 작동합니다.
Brian C

4
문제는 플러그인을 FTP를 통해 업데이트 할 수도 있다는 것입니다. 그렇기 때문에 데이터베이스에 저장된 옵션에 의존해야합니다.
기린

4
@giraff의 의견을 확장하기 위해 SVN 또는 Git과 같은 소스 제어로 코드를 관리하는 사람들에게도 마찬가지입니다. 따라서이 답변 업그레이드를 처리하는 가장 좋은 방법입니다.
doublesharp

3

그들이 업그레이드에 특정한 커스텀 훅 / 기능을 추가하지 않기로토론에서register_activation_hook , 플러그인은 관리자 페이지를 통해 업그레이드 될 때 호출되기 때문에 "대부분의 사람들"(4 년 전) 사용처럼 들린다 . 그 이후로 본 대부분의 예는 그 추세를 따릅니다.

대부분의 사용 plugins_loaded에서는 매 페이지로드마다 호출 되므로을 통해 연결하지 않는 것이 좋습니다 . 이에 대한 예외는 토론에서 언급됩니다. FTP / SVN을 통한 업그레이드 경로는 '가장 큰 경우'입니다. 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

플러그인이 업데이트되면 set_transient()기능을 사용하여 작업을 db로 설정합니다 . upgrader_process_complete후크 를 호출하는 동안 업데이트 코드를 추가하지 않는 것이 좋습니다 .
다음으로 다른 관리자 페이지를 탐색하면 plugins_loaded후크가 작동하고 업데이트 코드가 작동합니다.

업데이트 훅이 작동하려면이 플러그인이 활성화되어 있어야합니다.
이것은 플러그인 활성화에서 작동하지 않으므로 플러그인을 활성화하는 코드를 원하면 register_activation_hook()기능 으로 코딩해야 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.