Advertisement
  1. Web Design
  2. WordPress

Membuat lisensi dikendalikan memperbarui sistem: melakukan Update

Scroll to top
Read Time: 32 min
This post is part of a series called Create a License Controlled Theme and Plugin Update System.
Create a License Controlled Update System: The License Manager API

() translation by (you can also view the original English article)

Dalam tutorial pertama dua seri, kami telah membangun sebuah plugin untuk mengelola lisensi perangkat lunak. Dalam bagian 1, kami membangun tool administrasi yang diperlukan untuk menambahkan produk dan lisensi, dan di bagian 2, kami menciptakan sebuah API yang plugin dan tema dapat digunakan untuk mengakses informasi lisensi dan produk.

Sekarang, saatnya untuk mengikat semua bersama-sama dan membuat WordPress tema dan WordPress plugin yang menggunakan server lisensi untuk memeriksa pembaruan. Untuk melakukan ini, kita akan menciptakan sebuah class yang dapat dipakai ke WordPress plugin atau tema kode untuk membuat tema atau plugin yang menggunakan situs WordPress menjalankan plugin WP lisensi Manager kami untuk memeriksa pembaruan.

Dalam tutorial ini, Anda akan belajar tentang topik-topik berikut:

  • Bagaimana untuk menghubungkan ke sistem pembaruan tema WordPress.
  • Bagaimana untuk menghubungkan ke sistem update plugin WordPress (ya, dua-duanya terpisah — tetapi sama — dan harus dialamatkan satu-satu).
  • Bagaimana memanggil API eksternal dari WordPress.

Fungsi kita akan menciptakan dalam tutorial ini mengharuskan kita untuk menggali lebih dalam bagaimana WordPress bekerja di belakang layar, yang membuat tutorial ini sedikit lebih maju daripada dua yang pertama dalam seri. Namun, kita akan pergi melalui setiap langkah secara menyeluruh, jadi jika Anda telah mengikuti tutorial ini jauh, tidak harus menjadi tidak masalah menyelesaikan satu ini.

Seperti dalam bagian sebelumnya, Anda dapat mengikuti tutorial menulis kode Anda sendiri seperti kita pergi, atau download class akhir dan menggunakannya sebagai referensi.

Mari kita mulai.

1. menyiapkan lingkungan pengujian

Untuk membangun lisensi manajer klien class dan untuk menguji, Anda membutuhkan lingkungan pengujian dengan komponen-komponen berikut:

  • Server WordPress yang menjalankan plugin WP lisensi Manager yang dibuat di bagian 1 dan 2 dari seri tutorial. Kita akan menyebutnya license server.
  • Server WordPress untuk menjalankan plugin dan tema yang akan diperbarui. Kita akan menyebutnya tes server.
  • Sebuah tema untuk pengujian sistem pembaruan.
  • Sebuah plugin untuk pengujian sistem pembaruan.

Anda dapat menggunakan salah satu dari kamu yang ada tema dan plugin untuk pengujian, atau membuat placeholder tanpa konten riil atau fungsionalitas selain update, mengikuti petunjuk di bawah ini.

Langkah 1: Buat WordPress Tema untuk pengujian

Dalam wp-content/themes, membuat sebuah direktori baru yang disebut hello-world-theme (misalnya).

Dalam direktori tersebut, menambahkan file style.css dengan judul tema yang standar. Hal ini diperlukan untuk WordPress menemukan tema.

1
/*

2
Theme Name: Hello World Theme

3
Description: A test theme that says Hello.

4
Version: 0.1

5
*/

Menambahkan sebuah file index.php. Ini bisa kosong, atau Anda dapat menggunakan pengganti berikut HTML:

1
<html>
2
    <head>
3
        <title>Hello, World</title>
4
    </head>
5
    <body>
6
        <h1>Hello, World!</h1>
7
    </body>
8
</html>

Untuk pengujian lisensi manajer klien class, kita masih perlu functions.php file. Ini adalah dimana Anda akan menginisialisasi class yang akan dibuat dalam tutorial ini-untuk saat ini, Anda dapat meninggalkan file kosong.

Dengan konfigurasi ini minimal, WordPress akan menerima tema tanpa kesalahan. Aktifkan sekarang.

Sekali Anda telah memutuskan pada tema untuk menggunakan, tambahkan produk untuk menggambarkannya pada license server. Memanggil produk baru "Hello World Theme" dan ditetapkan nomor versi untuk sesuatu yang lebih tinggi dari 0,1 kita didefinisikan di header tema di atas.

Tandai bagian "post slug" bagian produk Permalink (hello-world-theme) karena akan digunakan sebagai ID Produk ketika berbicara dengan lisensi manager API.

Langkah 2: Buat sebuah Plugin untuk pengujian

Membuat plugin kosong tes yang bahkan lebih cepat daripada menciptakan tema tes. Semua yang Anda butuhkan adalah file PHP dengan bare-bones plugin header.

Dalam wp-content/plugins, membuat sebuah direktori yang disebut hello-world-plugin dan dalam hal ini, file, hello-world.php, dengan konten berikut:

1
<?php
2
/*

3
Plugin Name: Hello World Plugin

4
Description: A test plugin that says Hello.

5
Version: 0.1

6
*/

Plugin adalah sekarang siap jadi pergi ke depan dan mengaktifkannya.

Seperti yang Anda lakukan untuk tema, menciptakan produk untuk plugin ini pada server lisensi manajer. Memanggil Produk "Hello World Plugin"-ini akan memberikan Anda id (slug) hello-world-plugin — dan mengatur nomor versi untuk sesuatu yang lebih tinggi dari 0,1 didefinisikan dalam plugin header.

Sekarang bahwa Anda telah mengatur lingkungan pengujian Anda dan memiliki sebuah plugin dan tema siap untuk di testing, saatnya untuk memulai dengan lisensi manajer klien class itu sendiri.

2. menyiapkan License Manager Client Class

Mari kita mulai menciptakan License Manager Client class dengan membangun fungsi umum yang dibagikan oleh tema dan plugin. Seperti yang kita perlu menguji kode dalam beberapa konteks, kita akan mulai dengan tema dan menambahkan hal-hal tertentu di plugin setelah pembaruan tema bekerja.

Langkah 1: Membuat License Manager Client Class dan menginisialisasi itu

Dalam tema direktori (hello-world-theme), menambahkan class baru yang disebut Wp_License_Manager_Client (menggunakan file nama class-wp-license-manajer-client.php). Kelas ini akan menyelenggarakan semua kode yang terkait dengan memeriksa lisensi dan penanganan tema update.

Sebagai file class ini dimaksudkan untuk dimasukkan dalam sejumlah WordPress tema dan plugin, surround dengan cek class_exists. Dengan cara ini, jika ada banyak diinstal plugin dan tema yang menggunakan kelas ini, mereka tidak akan merusak sistem dengan mencoba untuk membuat class berkali-kali.

1
<?php
2
if ( ! class_exists( 'Wp_License_Manager_Client' ) ) {
3
4
    class Wp_License_Manager_Client {
5
    
6
    }
7
8
}

Mari kita lanjutkan dengan beberapa inisialisasi sebelum pindah ke fungsi sebenarnya.

Pertama, tambahkan beberapa variabel yang akan diinisialisasi dalam konstruktor class. Komentar kode menjelaskan variabel, dan saya akan menyebutkan mereka lagi ketika kita menggunakannya dalam kode.

1
/**

2
 * The API endpoint. Configured through the class's constructor.

3
 *

4
 * @var String  The API endpoint.

5
 */
6
private $api_endpoint;
7
8
/**

9
 * The product id (slug) used for this product on the License Manager site.

10
 * Configured through the class's constructor.

11
 *

12
 * @var int     The product id of the related product in the license manager.

13
 */
14
private $product_id;
15
16
/**

17
 * The name of the product using this class. Configured in the class's constructor.

18
 *

19
 * @var int     The name of the product (plugin / theme) using this class.

20
 */
21
private $product_name;
22
23
/**

24
 * The type of the installation in which this class is being used.

25
 *

26
 * @var string  'theme' or 'plugin'.

27
 */
28
private $type;
29
30
/**

31
 * The text domain of the plugin or theme using this class.

32
 * Populated in the class's constructor.

33
 *

34
 * @var String  The text domain of the plugin / theme.

35
 */
36
private $text_domain;
37
38
/**

39
 * @var string  The absolute path to the plugin's main file. Only applicable when using the

40
 *              class with a plugin.

41
 */
42
private $plugin_file;

Kemudian, tambahkan konstruktor untuk menetapkan variabel contoh ini:

1
/**

2
 * Initializes the license manager client.

3
 *

4
 * @param $product_id   string  The text id (slug) of the product on the license manager site

5
 * @param $product_name string  The name of the product, used for menus

6
 * @param $text_domain  string  Theme / plugin text domain, used for localizing the settings screens.

7
 * @param $api_url      string  The URL to the license manager API (your license server)

8
 * @param $type         string  The type of project this class is being used in ('theme' or 'plugin')

9
 * @param $plugin_file  string  The full path to the plugin's main file (only for plugins)

10
 */
11
public function __construct( $product_id, $product_name, $text_domain, $api_url,
12
                             $type = 'theme', $plugin_file = '' ) {
13
        // Store setup data

14
        $this->product_id = $product_id;
15
        $this->product_name = $product_name;
16
        $this->text_domain = $text_domain;
17
        $this->api_endpoint = $api_url;
18
        $this->type = $type;
19
        $this->plugin_file = $plugin_file;
20
    }
21
}

Untuk lebih memahami parameter ini digunakan untuk apa, dan link class ke tema Anda, buka file functions.php tema Anda dan membuat sebuah instance class Wp_License_Manager_Client:

1
<?php
2
require_once( 'class-wp-license-manager-client.php' );
3
4
if ( is_admin() ) {
5
    $license_manager = new Wp_License_Manager_Client(
6
        'hello-world-theme',
7
        'Hello World Theme',
8
        'hello-world-text',
9
        'https://<URL_TO_LICENSE_SERVER>/api/license-manager/v1'
10
    );
11
}

Mari kita pergi melalui kode baris demi baris:

Baris 2: Termasuk lisensi manajer class yang kita buat.

Baris 4: Lisensi manajer klien adalah hanya diperlukan dalam admin layar, sehingga untuk tidak membuat objek yang tidak perlu, memeriksa apakah pengguna adalah melihat salah satu WordPress admin layar atau tidak.

Baris 5-9: membuat instance Wp_License_Manager_Client yang menggunakan nilai parameter berikut:

  • hello-world-theme: slug (id) Produk (theme) pada license server.
  • Hello World Theme: nama tema. Ini akan digunakan untuk pengaturan layar dan lain situasi di mana kita perlu untuk merujuk pada produk oleh namanya.
  • Halo-world-text: teks domain tema Anda menggunakan untuk lokalisasi. Menggunakan domain teks yang sama untuk lisensi manajemen layar membuatnya lebih mudah untuk localizers untuk menerjemahkan seluruh tema sekaligus.
  • http://<URL_TO_LICENSE_SERVER>/api/license-manager/v1: ini adalah URL dengan api yang kami ciptakan dalam bagian sebelumnya dari seri tutorial. Mengganti URL_TO_LICENSE_SERVER dengan URL untuk situs WordPress di mana Anda menginstal plugin WP lisensi Manager.

Sisa dua parameter dalam konstruktor hanya diperlukan ketika class digunakan dengan sebuah plugin, jadi kita akan meninggalkan mereka ke nilai default untuk sekarang dan kembali kepada mereka kemudian dalam tutorial ketika kita pindah ke plugin update.

Langkah 2: Buat pengaturan layar untuk memasukkan kunci lisensi

Hal pertama yang pengguna harus dapat menggunakan lisensi manager API adalah lisensi key berlaku — dan cara untuk memasukkannya ke dalam tema.

Untuk ini, sekarang kita akan menciptakan layar pilihan baru.

Seperti yang kita telah menciptakan sejumlah serupa layar dalam bagian 1 dan 2 dari seri tutorial, aku akan pergi melalui kode hanya sebentar.

Perhatikan bahwa setiap bagian dari fungsionalitas yang masuk ke dalam lisensi manajer klien class harus diaktifkan dengan melampirkan salah satu class yang fungsi WordPress action atau filter. Dengan cara ini, segala sesuatu tetap bersih dan mudah untuk dikelila. Untuk menjaga hal-hal sesederhana mungkin untuk pengembang tema yang akan menggunakan class ini, saya telah meletakkan semua inisialisasi dalam konstruktor class.

Tambahkan pengaturan layar hook terkait ke konstruktor, tepat di bawah kode inisialisasi kami menambahkan di langkah sebelumnya:

1
// Add actions required for the class's functionality.

2
// NOTE: Everything should be done through actions and filters.

3
if ( is_admin() ) {
4
    // Add the menu screen for inserting license information

5
    add_action( 'admin_menu', array( $this, 'add_license_settings_page' ) );
6
    add_action( 'admin_init', array( $this, 'add_license_settings_fields' ) );
7
}

Kemudian, membuat fungsi dua yang disebutkan, add_license_settings_page dan add_license_settings_fields. Perhatikan bagaimana kami menggunakan variabel $product_name dan $text_domain dari konstruktor ketika menentukan judul untuk halaman pengaturan.

1
/**

2
 * Creates the settings items for entering license information (email + license key).

3
 */
4
public function add_license_settings_page() {
5
    $title = sprintf( __( '%s License', $this->text_domain ), $this->product_name );
6
7
    add_options_page(
8
        $title,
9
        $title,
10
        'read',
11
        $this->get_settings_page_slug(),
12
        array( $this, 'render_licenses_menu' )
13
    );
14
}
15
16
/**

17
 * Creates the settings fields needed for the license settings menu.

18
 */
19
public function add_license_settings_fields() {
20
    $settings_group_id = $this->product_id . '-license-settings-group';
21
    $settings_section_id = $this->product_id . '-license-settings-section';
22
23
    register_setting( $settings_group_id, $this->get_settings_field_name() );
24
25
    add_settings_section(
26
        $settings_section_id,
27
        __( 'License', $this->text_domain ),
28
        array( $this, 'render_settings_section' ),
29
        $settings_group_id
30
    );
31
32
    add_settings_field(
33
        $this->product_id . '-license-email',
34
        __( 'License e-mail address', $this->text_domain ),
35
        array( $this, 'render_email_settings_field' ),
36
        $settings_group_id,
37
        $settings_section_id
38
    );
39
40
    add_settings_field(
41
        $this->product_id . '-license-key',
42
        __( 'License key', $this->text_domain ),
43
        array( $this, 'render_license_key_settings_field' ),
44
        $settings_group_id,
45
        $settings_section_id
46
    );
47
}

Kedua fungsi yang dibuat di atas mendefinisikan sejumlah callback untuk render halaman pengaturan dan bidang pengaturan. Tambahkan fungsi callback:

1
/**

2
 * Renders the description for the settings section.

3
 */
4
public function render_settings_section() {
5
    _e( 'Insert your license information to enable updates.', $this->text_domain);
6
}
7
8
/**

9
 * Renders the settings page for entering license information.

10
 */
11
public function render_licenses_menu() {
12
    $title = sprintf( __( '%s License', $this->text_domain ), $this->product_name );
13
    $settings_group_id = $this->product_id . '-license-settings-group';
14
15
    ?>
16
        <div class="wrap">
17
            <form action='options.php' method='post'>
18
19
                <h2><?php echo $title; ?></h2>
20
21
                <?php
22
                    settings_fields( $settings_group_id );
23
                    do_settings_sections( $settings_group_id );
24
                    submit_button();
25
                ?>
26
27
            </form>
28
        </div>
29
    <?php
30
}
31
32
/**

33
 * Renders the email settings field on the license settings page.

34
 */
35
public function render_email_settings_field() {
36
    $settings_field_name = $this->get_settings_field_name();
37
    $options = get_option( $settings_field_name );
38
    ?>
39
        <input type='text' name='<?php echo $settings_field_name; ?>[email]'
40
           value='<?php echo $options['email']; ?>' class='regular-text'>
41
    <?php
42
}
43
44
/**

45
 * Renders the license key settings field on the license settings page.

46
 */
47
public function render_license_key_settings_field() {
48
    $settings_field_name = $this->get_settings_field_name();
49
    $options = get_option( $settings_field_name );
50
    ?>
51
        <input type='text' name='<?php echo $settings_field_name; ?>[license_key]'
52
           value='<?php echo $options['license_key']; ?>' class='regular-text'>
53
    <?php
54
}

Untuk meminimalkan resiko kesalahan ketik ketika mengetik nama bidang pengaturan, saya telah membuat fungsi helper, get_settings_field_name, yang digunakan di seluruh snipet kode di atas. Fungsi helper lain, get_settings_page_slug, digunakan untuk menentukan path ke layar pengaturan.

Tambahkan fungsi dua itu pada akhir class untuk membuat kode berjalan tanpa kesalahan:

1
/**

2
 * @return string   The name of the settings field storing all license manager settings.

3
 */
4
protected function get_settings_field_name() {
5
    return $this->product_id . '-license-settings';
6
}
7
8
/**

9
 * @return string   The slug id of the licenses settings page.

10
 */
11
protected function get_settings_page_slug() {
12
    return $this->product_id . '-licenses';
13
}

Fungsi menggunakan $product_id dimasukan dalam konstruktor untuk membuat bidang pengaturan dan pengaturan halaman siput. Dengan cara ini, setiap tema atau plugin yang menggunakan class akan mendapatkan pengaturan mereka sendiri dan tidak akan ada konflik.

Halaman pengaturan siap dan tampak seperti ini:

License settings screenLicense settings screenLicense settings screen

Langkah 3: Menambahkan pengingat untuk pengguna

Sangat mudah bagi pengguna untuk melewatkan suasana seperti ini dan akhirnya bertanya-tanya mengapa tema tidak memperoleh pembaruan. Itulah mengapa itu adalah ide yang baik untuk membuat pengingat yang akan ditampilkan di admin, sampai pengguna mengkonfigurasi tema dan memasuki lisensi key.

Saatnya untuk action WordPress lain. action admin_notices digunakan untuk semua WordPress pemberitahuan dan kesalahan, karena itu pas untuk keperluan kami.

Dalam konstruktor, tepat di bawah dua action kami menambahkan sebelumnya, tambahkan:

1
// Add a nag text for reminding the user to save the license information

2
add_action( 'admin_notices', array( $this, 'show_admin_notices' ) );

Kemudian, tambahkan fungsi, show_admin_notices:

1
/**

2
 * If the license has not been configured properly, display an admin notice.

3
 */
4
public function show_admin_notices() {
5
    $options = get_option( $this->get_settings_field_name() );
6
7
    if ( !$options || ! isset( $options['email'] ) || ! isset( $options['license_key'] ) ||
8
        $options['email'] == '' || $options['license_key'] == '' ) {
9
10
        $msg = __( 'Please enter your email and license key to enable updates to %s.', $this->text_domain );
11
        $msg = sprintf( $msg, $this->product_name );
12
        ?>
13
            <div class="update-nag">
14
                <p>
15
                    <?php echo $msg; ?>
16
                </p>
17
18
                <p>
19
                    <a href="<?php echo admin_url( 'options-general.php?page=' . $this->get_settings_page_slug() ); ?>">
20
                        <?php _e( 'Complete the setup now.', $this->text_domain ); ?>
21
                    </a>
22
                </p>
23
            </div>
24
        <?php
25
    }
26
}

Fungsi pertama cek jika opsi yang telah ditetapkan. Jika tidak ada pilihan item atau salah satu dari dua kolom yang harus diisi kosong, ini menunjukkan pemberitahuan dan link ke halaman pengaturan tema lisensi dimana pengguna dapat menyelesaikan setup. class, update-nag, mendefinisikan tampilan pemberitahuan.

Berikut adalah apa "nag" seperti apa, muncul di bagian atas dasbor admin:

Reminder for updating the license settingsReminder for updating the license settingsReminder for updating the license settings

Sekarang, untuk membuat nag pergi, mari kita menempatkan dalam informasi lisensi.

Pertama, kunjungi server lisensi WordPress admin area dan menciptakan lisensi baru untuk tema tes (Hello World Theme). Setelah Anda mengklik Add License, Anda akan melihat daftar lisensi.

Salin kunci lisensi yang dihasilkan oleh plugin manajer lisensi. Kemudian, kembali ke situs tes Anda dan mengkonfigurasi pengaturan lisensi tema dengan memasukkan alamat email Anda dan lisensi key yang disalin dari server lisensi manajer.

Nag Anda sudah pergi dan setting theme di tempat pengujian fungsionalitas yang akan kita buat berikutnya.

3. berkomunikasi dengan API lisensi Manager

Dengan framework dasar di tempat, mari kita lihat berkomunikasi dengan lisensi manager API.

Langkah 1: Tambahkan fungsi untuk memanggil API

Pertama, menambahkan fungsi untuk memanggil API lisensi Manager. Fungsi mengambil parameter kedua: metode API atau tindakan untuk memanggil server lisensi manajer, dan sebuah array dengan parameter untuk action:

1
//

2
// API HELPER FUNCTIONS

3
//

4
5
/**

6
 * Makes a call to the WP License Manager API.

7
 *

8
 * @param $method   String  The API action to invoke on the license manager site

9
 * @param $params   array   The parameters for the API call

10
 * @return          array   The API response

11
 */
12
private function call_api( $action, $params ) {
13
    $url = $this->api_endpoint . '/' . $action;
14
15
    // Append parameters for GET request

16
    $url .= '?' . http_build_query( $params );
17
18
    // Send the request

19
    $response = wp_remote_get( $url );
20
    if ( is_wp_error( $response ) ) {
21
        return false;
22
    }
23
  	
24
    $response_body = wp_remote_retrieve_body( $response );
25
    $result = json_decode( $response_body );
26
	
27
    return $result;
28
}

Baris 13: Membuat URL untuk memanggil, menggunakan URL base dimasikan sebagai parameter konstruktor ($api_endpoint), dan action dimasukan sebagai parameter ($method).

Baris 16: Menggunakan http_build_query fungsi PHP untuk membuat string parameter URL dikodekan dan menambahkan untuk request GET.

Baris 19: Menggunakan WordPress built-in HTTP fungsi wp_remote_get untuk mengirim sebuah GET request ke URL yang dihasilkan pada baris sebelumnya.

Baris 20-22: melakukan beberapa kesalahan asas untuk melihat jika terjadi kesalahan. Kami akan menambahkan fungsi is_api_error berikutnya.

Baris 24-25: membaca respon dan mengurai dari JSON encoded string ke array yang berisi data yang diterima dari server lisensi.

Baris 27: Mengembalikan respon.

Selanjutnya, tambahkan fungsi memeriksa kesalahan. Penanganan sangat kasar dan tidak pergi ke setiap detail tentang apa yang salah — hanya cukup untuk mengetahui jika ada kesalahan atau tidak:

1
/**

2
 * Checks the API response to see if there was an error.

3
 *

4
 * @param $response mixed|object    The API response to verify

5
 * @return bool     True if there was an error. Otherwise false.

6
 */
7
private function is_api_error( $response ) {
8
    if ( $response === false ) {
9
        return true;
10
    }
11
12
    if ( ! is_object( $response ) ) {
13
        return true;
14
    }
15
16
    if ( isset( $response->error ) ) {
17
        return true;
18
    }
19
20
    return false;
21
}

Langkah 2: Tambahkan fungsi untuk mengambil lisensi dan Update informasi

Sekarang bahwa kita telah menciptakan fungsi untuk berbicara dengan API, kita dapat menggunakannya untuk menghubungi server lisensi untuk mendapatkan beberapa informasi tentang tema atau plugin.

Tambahkan fungsi berikut untuk memanggil action info:

1
/**

2
 * Calls the License Manager API to get the license information for the

3
 * current product.

4
 *

5
 * @return object|bool   The product data, or false if API call fails.

6
 */
7
public function get_license_info() {
8
    $options = get_option( $this->get_settings_field_name() );
9
    if ( ! isset( $options['email'] ) || ! isset( $options['license_key'] ) ) {
10
        // User hasn't saved the license to settings yet. No use making the call.

11
        return false;
12
    }
13
14
    $info = $this->call_api(
15
        'info',
16
        array(
17
            'p' => $this->product_id,
18
            'e' => $options['email'],
19
            'l' => $options['license_key']
20
        )
21
    );
22
23
    return $info;
24
}

Baris 8: Mengambil lisensi manajer klien pilihan.

Baris 9 – 12: memverifikasi bahwa lisensi key dan email pilihan telah ditetapkan. Jika kita tidak punya mereka, memanggil API akan membuang-buang waktu — kita sudah tahu bahwa permintaan akan gagal.

Baris 14-21: Memanggil action info lisensi manager API dengan parameter berikut:

  • p: Produk ID didefinisikan dalam konstruktor Wp_License_Manager_Client.
  • e: alamat email pemilik lisensi, membaca dari pengaturan.
  • l: kunci lisensi, membaca dari pengaturan.

Baris 23: Mengembalikan data lisensi. Data akan mencakup bidang-bidang berikut:

  • name: Nama Produk (tema atau plugin).
  • description: Deskripsi produk.
  • version: versi saat ini tersedia di server.
  • package_url: URL download untuk produk. Ini adalah sebuah URL untuk mendapatkan API action pada server lisensi manajer.
  • Last_updated: Kapan produk telah diperbarui.
  • description_url: sebuah URL untuk halaman yang dapat digunakan untuk menampilkan informasi lebih lanjut tentang produk.
  • tested: tertinggi versi WordPress yang produk telah diuji (diperlukan hanya untuk plugin).
  • banner_low: resolusi rendah (reguler) versi produk banner gambar (hanya diperlukan untuk plugin).
  • banner_high: versi resolusi tinggi (retina) gambar banner Produk (hanya diperlukan untuk plugin).

Selanjutnya, mari kita gunakan fungsi untuk memeriksa apakah ada update yang menunggu untuk di-download. Tambahkan fungsi berikut:

1
/**

2
 * Checks the license manager to see if there is an update available for this theme.

3
 *

4
 * @return object|bool  If there is an update, returns the license information.

5
 *                      Otherwise returns false.

6
 */
7
public function is_update_available() {
8
    $license_info = $this->get_license_info();
9
    if ( $this->is_api_error( $license_info ) ) {
10
        return false;
11
    }
12
13
    if ( version_compare( $license_info->version, $this->get_local_version(), '>' ) ) {
14
        return $license_info;
15
    }
16
17
    return false;
18
}

Baris 8: Permintaan informasi produk yang menggunakan fungsi get_license_info yang baru Anda buat.

Baris 9 – 11: jika terjadi kesalahan saat membuat panggilan API, kembalikan nilai false. Ini juga akan ide yang baik untuk menunjukkan kesalahan pengguna-untuk menjaga hal-hal sederhana, aku meninggalkan bahwa fungsi untuk sekarang.

Baris 13: Menggunakan version_compare PHP untuk melihat apakah nomor versi yang diterima dari server lebih tinggi dari nomor versi lokal.

Baris 14: Jika update tersedia, kembalikan data lisensi. Dengan kembali data segera, kami menyimpan diri kita perlu melakukan panggilan API tambahan untuk mendapatkan data lagi.

Untuk menyelesaikan fungsi ini, kita masih perlu untuk menerapkan fungsi untuk mengambil nomor versi lokal, digunakan pada barus 13. Plugin dan tema data yang diakses sedikit berbeda, sehingga fungsi akan memiliki implementasi yang terpisah untuk keduanya:

1
/**

2
 * @return string   The theme / plugin version of the local installation.

3
 */
4
private function get_local_version() {
5
    if ( $this->is_theme() ) {
6
        $theme_data = wp_get_theme();
7
        return $theme_data->Version;
8
    } else {
9
        $plugin_data = get_plugin_data( $this->plugin_file, false );
10
        return $plugin_data['Version'];
11
    }
12
}

Baris 2: Mendapatkan data tema saat ini.

Baris 3: Membaca versi dan mengembalikannya.

Baris 5: Plugin data dibaca menggunakan fungsi berbeda, get_plugin_data, yang menggunakan nama berkas utama plugin sebagai pengenal. Kami akan menetapkan variabel $this-> plugin_file, kemudian ketika mengintegrasikan ke plugin uji kami.

Baris 6: Mengembalikan nomor versi plugin.

Tambahkan is_theme fungsi untuk memeriksa jenis produk yang dalam yang kami beroperasi:

1
private function is_theme() {
2
    return $this->type == 'theme';
3
}

Kami sekarang telah menciptakan fungsi-fungsi yang diperlukan untuk menyambung ke server lisensi dan memeriksa jika ada versi yang lebih baru yang tersedia. Selanjutnya, ini adalah waktu untuk benar-benar menarik bagian: mengikat ini ke WordPress memperbarui fungsi.

4. Bagaimana WordPress memeriksa pembaruan

Framework untuk membangun sistem update theme dan plugin ini di tempat. Saatnya untuk mulai menggali lebih dalam ke dalam fungsi pembaruan WordPress.

Pada action admin_init (dan sejumlah lain, yang lebih spesifik, action), jika cukup waktu telah berlalu sejak pemeriksaan Pemutakhiran Terakhir, membandingkan WordPress Plugin dan tema terhadap versi host di WordPress.org Plugin dan tema direktori untuk melihat apakah baru Versi telah dirilis.

Setelah cek, WordPress menyimpan hasil ke transient situs: update_themes untuk tema dan update_plugins untuk plugin.

Kemudian, ketika Anda mengunjungi halaman update (atau halaman tema dan plugin), WordPress memeriksa ini transien untuk melihat dan menandai tema dan plugin yang memiliki update yang tersedia.

Ketika Anda melihat kode untuk fungsi ini (yang dapat Anda temukan di wp-includes/update.php) Anda dapat melihat bahwa ini telah dirancang untuk bekerja dengan direktori resmi dan tidak ada lagi: tidak ada hook untuk menentukan server untuk memeriksa terhadap atau untuk sniffing request sebelum dikirim.

Tapi itu belum berhenti pengembang plugin dan tema dari menggunakan server lisensi mereka sendiri — dan itu tidak akan menghentikan kita baik.

Solusinya terletak pada cara hasil update memeriksa disimpan. Saya sebutkan di atas bahwa hasil pencarian update disimpan dalam transien. Dan tepat pada awal set_site_transient fungsi WordPress, kita menemukan:

1
/**

2
 * Filter the value of a specific site transient before it is set.

3
 *

4
 * The dynamic portion of the hook name, $transient, refers to the transient name.

5
 *

6
 * @since 3.0.0

7
 *

8
 * @param mixed $value Value of site transient.

9
 */
10
$value = apply_filters( 'pre_set_site_transient_' . $transient, $value );

Filter ini memberi kami akses ke isi data update plugin dan tema sebelum disimpan, hanya dalam waktu untuk menambahkan data kami sendiri untuk itu!

5. mengaitkan ke WordPress Theme update

Mari kita mulai menerapkan pembaruan kita sendiri memeriksa kode, mulai dari tema.

Langkah 1: Buat Filter ke Hook ke pemeriksaan pemutakhiran tema

Seperti yang kita lihat di atas, ketika WordPress telah selesai memeriksa tema pembaruan dari WordPress.org direktori tema, menyimpan informasi tentang tema membutuhkan update di transien yang disebut update_themes.

Untuk memeriksa pembaruan kita sendiri dan menambahkan data ke transient sebelum disimpan, kami akan menghubungkan fungsi kita sendiri untuk filter, pre_set_site_transient_update_themes. Dalam fungsi ini, kami akan memanggil server lisensi untuk memeriksa pembaruan tema ini, dan kemudian, jika ada update yang tersedia, menambahkan informasi di transien.

Pertama, tambahkan filter pada akhir konstruktor Wp_License_Manager_Client's:

1
if ( $type == 'theme' ) {
2
    // Check for updates (for themes)

3
    add_filter( 'pre_set_site_transient_update_themes', array( $this, 'check_for_update' ) );
4
}

Kemudian, membuat fungsi, check_for_update:

1
/**

2
 * The filter that checks if there are updates to the theme or plugin

3
 * using the WP License Manager API.

4
 *

5
 * @param $transient    mixed   The transient used for WordPress

6
 *                          	theme / plugin updates.

7
 *

8
 * @return mixed        The transient with our (possible) additions.

9
 */
10
public function check_for_update( $transient ) {
11
    if ( empty( $transient->checked ) ) {
12
        return $transient;
13
    }
14
15
    $info = $this->is_update_available();
16
    if ( $info !== false ) {
17
18
        if ( $this->is_theme() ) {
19
            // Theme update

20
            $theme_data = wp_get_theme();
21
            $theme_slug = $theme_data->get_template();
22
23
            $transient->response[$theme_slug] = array(
24
                'new_version' => $info->version,
25
                'package' => $info->package_url,
26
                'url' => $info->description_url
27
            );
28
        } else {
29
            // Plugin updates will be added here.

30
        }
31
    }
32
33
    return $transient;
34
}

Baris 10-13: $transient->checked adalah sebuah array dengan semua tema yang saat ini terinstal dan nomor versi mereka (tema stylesheet sebagai key) dan versi sebagai nilai. Jika Anda adalah untuk memeriksa pembaruan untuk beberapa tema sekaligus, Anda dapat menggunakan array untuk mengumpulkan data dan mengirimkannya untuk server lisensi Anda. Dalam versi ini sederhana, namun, kami hanya memverifikasi bahwa array tidak kosong dan melanjutkan.

Baris 15 – 16: Periksa jika ada update yang tersedia untuk produk ini (theme) pada server lisensi kami, menggunakan fungsi is_update_available yang kita buat sebelumnya. Fungsi mengembalikan informasi produk jika versi pada server lisensi lebih tinggi dari yang diinstal dan false jika tidak ada update yang tersedia.

Baris 18: Periksa apakah ini adalah tema atau plugin. Pada titik ini, kita akan hanya berfokus pada tema pembaruan, jadi aku telah meninggalkan cabang lain yang kosong untuk saat ini.

Baris 20-21: menemukan tema "slug" untuk menggunakannya sebagai key untuk menandai tema saat ini membutuhkan update.

Baris 23-27: masukkan informasi yang berhubungan dengan tema update ke dalam sementara $response array, menggunakan tema slug sebagai key.

  • new_version: versi tema pada server.
  • package: URL untuk men-download paket tema. Seperti WordPress harus mampu untuk men-download tema langsung dari URL ini, kami menciptakan lisensi manager untuk mengembalikan URL terbentuk sepenuhnya dalam informasi lisensi, termasuk pengguna email alamat dan lisensi key.
  • url: URL halaman untuk menampilkan informasi tentang tema. Parameter ini digunakan ketika mengklik untuk informasi lebih lanjut di halaman Themes.

Baris 33: Mengembalikan sementara sehingga dapat menyimpan WordPress — dengan tema kami memperbarui informasi yang ditambahkan untuk itu.

Dan hanya itu! Anda sekarang telah membangun sistem update lengkap untuk host sendiri WordPress tema. Mari kita menguji fungsionalitas dan kemudian bergerak pada untuk update plugin.

Langkah 2: Menguji pembaruan tema

Sebelum pindah ke update plugin, mari kita menguji fungsionalitas untuk melihat update in action.

Memperbarui tema yang Anda gunakan untuk pengujian akan menimpa tema, jadi sebagai hal pertama, membuat file zip baru menggunakan file. Kemudian upload zip file ke Amazon S3 seperti yang kita lakukan pada bagian 2 dari seri tutorial.

Selanjutnya, log in ke server lisensi dan mengedit Hello World Theme informasi produk, memastikan menggunakan file zip Anda hanya meng-upload ke Amazon S3 dan produk nomor versi lebih tinggi dari salah satu tema yang terinstal secara lokal.

Edit product information

Simpan perubahan dan kepala kembali ke server tes untuk menguji update.

Pada tes server, klik pada Dashboard > Updates. WordPress sekarang akan melakukan panggilan API untuk memeriksa jika ada tema membutuhkan update. Jika tidak ada yang terjadi, bisa jadi bahwa cek sebelumnya telah hanya terjadi dan WordPress masih menunggu untuk batas waktu di antara versi cek untuk sukses. Dalam hal ini, menunggu satu menit dan klik Check Again untuk memaksa cek.

Sekarang, Anda akan melihat tema Anda dalam daftar tema yang dapat diperbarui.

Hello World Theme is in need of an updateHello World Theme is in need of an updateHello World Theme is in need of an update

Selanjutnya, mencoba melakukan update. Jika semuanya berjalan baik — sebagaimana mestinya-Anda akan melihat output berikut. Secara default, rincian tidak Tampilkan kecuali ada kesalahan, jadi Anda harus klik Show Details untuk melihat apa yang terjadi di update.

Perhatikan bagaimana tema tidak download dari WordPress.org tetapi agak lisensi manajer server sendiri.

Theme updateTheme updateTheme update

6. mengaitkan untuk WordPress Plugin update

Dengan tema update dilakukan dan diuji, kami hampir selesai dengan tutorial. Sebagian besar dari kode yang akan dibutuhkan untuk memperbarui plugin sudah di tempat. Tetapi ada beberapa perbedaan dan penambahan diperlukan, jadi mari kita pergi untuk bekerja dan menambahkan dukungan untuk plugin kelas lisensi manajer klien kami.

Langkah 1: Masukan Client Class di Plugin Anda

Salin file class-wp-license-manajer-client.php ke folder sumber plugin tes Anda. Kemudian, di tempat yang cocok di plugin, tempat kode inisialisasi berikut.

Jika Anda menggunakan plugin kosong tes, hanya drop ke dalam berkas utama plugin, tepat di bawah plugin header. Ingatlah untuk mengganti <URL_TO_LICENSE_SERVER>dengan server URL.

1
require_once( 'class-wp-license-manager-client.php' );
2
3
if ( is_admin() ) {
4
    $license_manager = new Wp_License_Manager_Client(
5
        'hello-world-plugin',
6
        'Hello World Plugin',
7
        'hello-world-plugin-text',
8
        'http://<URL_TO_LICENSE_SERVER>/api/license-manager/v1',
9
        'plugin',
10
        __FILE__
11
    );
12
}

Sebagian besar parameter yang sama ketika initializing class untuk digunakan dengan tema — dengan berbeda, produk nilai spesifik (misalnya hello-world-plugin daripada hello-world-theme).

Dua parameter tidak digunakan ketika membuat suatu tema, jadi mari kita melihat mereka:

  • $type (dengan nilai plugin) memberitahu Wp_License_Manager_Client contoh menggunakan plugin fungsi tertentu.
  • $plugin_file (terakhir parameter) digunakan untuk mengambil plugin pengidentifikasi untuk meminta data plugin seperti versi sekarang. Ketika inisialisasi ini dilakukan di kelas utama plugin, kita dapat menggunakan __FILE__.

Langkah 2: Memeriksa pembaruan Plugin

Sebelumnya dalam tutorial ini, kita hook class Wp_License_Manager_Client kami untuk mencari perubahan dalam update_themes sementara dengan menempatkan baris add_filter pada akhir konstruktor. Update plugin akan ditangani dengan sama, hanya menggunakan update_plugins sementara bukan update_themes.

Jadi, tepat setelah filter yang ada, tambahkan kode spesifik plugin (baris 1-3 sudah hadir dalam konstruktor, jadi saya memasukan mereka di sini untuk menunjukkan mana kode baru harus pergi):

1
if ( $type == 'theme' ) {
2
    // Check for updates (for themes)

3
    add_filter( 'pre_set_site_transient_update_themes', array( $this, 'check_for_update' ) );
4
} elseif ( $type == 'plugin' ) {
5
    // Check for updates (for plugins)

6
    add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_for_update' ) );
7
}

Ketika Anda melihat kode di atas, filter baru menggunakan fungsi yang sama seperti yang kami menambahkan untuk tema, check_for_update.

Sebelumnya, ketika kita menciptakan fungsi check_for_update, kami meninggalkan satu cabang lain kosong, menunggu untuk diisi dengan kode untuk menangani plugin update. Sekarang, mari kita menambahkan konten ke bagian tersebut. Berikut adalah seluruh fungsi dengan plugin yang berhubungan dengan kode ditambahkan mulai dari baris 27:

1
/**

2
 * The filter that checks if there are updates to the theme or plugin

3
 * using the License Manager API.

4
 *

5
 * @param $transient    mixed   The transient used for WordPress theme updates.

6
 * @return mixed        The transient with our (possible) additions.

7
 */
8
public function check_for_update( $transient ) {
9
    if ( empty( $transient->checked ) ) {
10
        return $transient;
11
    }
12
13
    if ( $this->is_update_available() ) {
14
        $info = $this->get_license_info();
15
16
        if ( $this->is_theme() ) {
17
            // Theme update

18
            $theme_data = wp_get_theme();
19
            $theme_slug = $theme_data->get_template();
20
21
            $transient->response[$theme_slug] = array(
22
                'new_version' => $info->version,
23
                'package' => $info->package_url,
24
                'url' => $info->description_url
25
            );
26
        } else {
27
            // Plugin update

28
            $plugin_slug = plugin_basename( $this->plugin_file );
29
30
            $transient->response[$plugin_slug] = (object) array(
31
                'new_version' => $info->version,
32
                'package' => $info->package_url,
33
                'slug' => $plugin_slug
34
            );
35
        }
36
    }
37
38
    return $transient;
39
}

Melihat kode, ada baiknya untuk melihat bahwa sementara fungsi yang sama, sekarang kita sedang menangani berbeda transient, update_plugins daripada update_themes. Salah satu cara ini menunjukkan adalah bahwa sementara data dalam update_themes disimpan sebagai array, update_plugins menggunakan objek (baris 30)!

Panggilan untuk API lisensi Manager kami yang sama ketika menggunakan tema, tapi data yang disimpan untuk sementara sedikit berbeda — berdasarkan apa WordPress mengharapkan untuk menemukan di transien.

Dengan kode ini di tempat, Anda dapat sudah menguji pembaruan dengan cara yang sama kita lakukan dengan tema (buat zip file, meng-upload ke S3, mengedit properti produk). Pastikan nomor versi plugin pada server lisensi lebih tinggi daripada yang diinstal, dan navigasikan ke server tes Updates halaman. Pembaruan untuk Hello World Plugin harus muncul:

update for the Hello World Plugin appearsupdate for the Hello World Plugin appearsupdate for the Hello World Plugin appears

Ketika Anda memutahirkan plugin, Anda akan melihat bahwa itu adalah download dari server Anda sendiri seperti tema.

Tapi kita belum cukup selesai: jika Anda melihat informasi plugin dalam screenshot di atas, Anda akan melihat "Kompatibilitas dengan WordPress 4.0.1" mengatakan "Tidak diketahui". Juga, jika Anda klik View version 0.2 details, pesan kesalahan ditampilkan.

Mari kita memperbaiki hal ini.

Langkah 3: Sediakan informasi Plugin

Untuk mengumpulkan informasi yang menunjukkan tentang plugin, WordPress menggunakan fungsi yang disebut plugins_api. Secara default, fungsi memanggil API WordPress.org, seperti cek versi. Namun, tidak seperti memeriksa versi, fungsi ini berisi tiga filter kuat: plugins_api_args untuk mengedit parameter dikirim ke API, plugins_api untuk mengganti default permintaan API, dan plugins_api_result untuk mengedit hasil diterima dari API.

Kita akan menggunakan plugins_api karena memberikan kita tingkat terbesar mengontrol fungsi: ketika WordPress memulai panggilan API plugin untuk mendapatkan informasi tentang plugin saat ini, fungsi kita akan melompat dan menangani request menggunakan server lisensi bukan WordPress.org. Seluruh permintaan akan ditinggalkan untuk WordPress untuk di proses.

Pertama, tambahkan filter dalam konstruktor Wp_License_Manager_Client plugin di cabang else tertentu:

1
// Showing plugin information

2
add_filter( 'plugins_api', array( $this, 'plugins_api_handler' ), 10, 3 );

Kemudian, tambahkan fungsi:

1
/**

2
 * A function for the WordPress "plugins_api" filter. Checks if

3
 * the user is requesting information about the current plugin and returns

4
 * its details if needed.

5
 *

6
 * This function is called before the Plugins API checks

7
 * for plugin information on WordPress.org.

8
 *

9
 * @param $res      bool|object The result object, or false (= default value).

10
 * @param $action   string      The Plugins API action. We're interested in 'plugin_information'.

11
 * @param $args     array       The Plugins API parameters.

12
 *

13
 * @return object   The API response.

14
 */
15
public function plugins_api_handler( $res, $action, $args ) {
16
    if ( $action == 'plugin_information' ) {
17
18
        // If the request is for this plugin, respond to it

19
        if ( isset( $args->slug ) && $args->slug == plugin_basename( $this->plugin_file ) ) {
20
            $info = $this->get_license_info();
21
22
            $res = (object) array(
23
                'name' => isset( $info->name ) ? $info->name : '',
24
                'version' => $info->version,
25
                'slug' => $args->slug,
26
                'download_link' => $info->package_url,
27
28
                'tested' => isset( $info->tested ) ? $info->tested : '',
29
                'requires' => isset( $info->requires ) ? $info->requires : '',
30
                'last_updated' => isset( $info->last_updated ) ? $info->last_updated : '',
31
                'homepage' => isset( $info->description_url ) ? $info->description_url : '',
32
33
                'sections' => array(
34
                    'description' => $info->description,
35
                ),
36
37
                'banners' => array(
38
                    'low' => isset( $info->banner_low ) ? $info->banner_low : '',
39
                    'high' => isset( $info->banner_high ) ? $info->banner_high : ''
40
                ),
41
42
                'external' => true
43
            );
44
45
            // Add change log tab if the server sent it

46
            if ( isset( $info->changelog ) ) {
47
                $res['sections']['changelog'] = $info->changelog;
48
            }
49
50
            return $res;
51
        }
52
    }
53
54
    // Not our request, let WordPress handle this.

55
    return false;
56
}

Baris 16: Periksa Plugin API action yang diminta. Kami sedang hanya tertarik pada plugin_information, jadi jika WordPress meminta sesuatu yang lain, kita hanya mengembalikan nilai false dan membiarkan permintaan pergi semua jalan ke WordPress.org.

Baris 19: Periksa apakah request tentang plugin saat ini. Jika ya, kita akan mengambil permintaan dan menanganinya. Jika tidak, mengembalikan nilai false sehingga kita tidak memotong request API plugin-plugin lainnya.

Baris 20: Menghubungi server lisensi kami untuk mengambil informasi untuk produk saat ini.

Baris 22-48: mengumpulkan semua data plugin yang kami dapatkan dari info request. Sekarang, kami akhirnya menggunakan semua bidang yang dikembalikan oleh API.

Baris 50: Mengembalikan object result.

Untuk menguji fungsi ini, mengedit produk Hello World Plugin pada server lisensi Anda dan menambahkan nilai untuk semua bidang pengaturan produk. Selain pengaturan ditetapkan sebelumnya, masukkan yang berikut, menetapkan nilai-nilai untuk apa pun yang Anda suka — kami hanya menguji...

  • Tested with WordPress version: versi WordPress tertinggi Anda telah diuji plugin pada.
  • Requires WordPress version: versi WordPress minimum yang diperlukan untuk menjalankan plugin Anda.
  • Last Updated: Tanggal terakhir update ke plugin ini, dalam format YYYY-MM-DD.
  • Banner low and Banner high: bidang ini mendefinisikan normal (rendah) dan retina (tinggi) versi banner yang ditampilkan di atas layar informasi plugin. Sisipkan URL untuk gambar ukuran berikut: 772 x 250 untuk rendah dan 1544 x 500 untuk tinggi.

Simpan produk dan kepala kembali ke halaman Updates situs pengujian. Sekarang, Anda akan melihat bahwa ada bidang kompatibilitas versi WordPress tidak lagi tidak diketahui, dan ketika Anda klik pada Lihat Versi 0.2 rincian, Anda akan melihat popup ini:

Hello World Plugin popupHello World Plugin popupHello World Plugin popup

Kesimpulan

Kami sekarang telah menciptakan sepenuhnya fungsional, lisensi dikendalikan WordPress plugin dan tema update sistem. Itu masih agak dasar, tapi sudah dapat digunakan untuk melewati update untuk pengguna internal organisasi Anda atau pelanggan plugin dan tema premium Anda.

Mudah-mudahan, Anda juga belajar sesuatu yang baru tentang bekerja dengan WordPress Plugin dan tema dan dapat menggunakan pengetahuan dalam menciptakan proyek Anda sendiri.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.