Advertisement
  1. Web Design
  2. WordPress

Membuat lisensi mengendaikan update siste,: lisensi Manager Plugin

Scroll to top
Read Time: 34 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)

Sebagai besar sebagai resmi WordPress theme dan plugin direktori, ada saat-saat ketika Anda tidak ingin menggunakannya untuk mendistribusikan plugin atau tema. Mungkin itu adalah karena Anda menjual plugin atau tema, atau mungkin Anda hanya ingin menyimpannya untuk diri sendiri, membuat mereka hanya tersedia dalam organisasi atau kelompok teman-teman Anda.

Tapi bagaimana tentang pembaruan?

Jika Anda hanya pengguna, hanya meng-upload plugin atau tema secara manual bekerja dengan cukup baik. Tetapi bila Anda memiliki lebih banyak pengguna daripada, menggunakan Updates halaman admin dalam WordPress akan menjadi berguna.

Fungsi update WordPress yang telah dirancang dengan hanya resmi WordPress plugin dan tema direktori dalam pikiran, tetapi jangan khawatir: WordPress memiliki action dan filter yang memungkinkan kita untuk menghubungkan ke bahwa fungsi dan menambahkan server kita sendiri dalam campuran kita.

Apa yang akan Anda Pelajari

Dalam tutorial ini pertama dalam seri, kita akan mulai dengan menciptakan sebuah plugin untuk mengubah website Anda menjadi lisensi manajemen server. Dalam bagian kedua, kami akan terus membangun plugin dengan menambahkan sebuah API untuk itu. Dalam bagian tiga, kita akan menggunakan API membuat WordPress plugin atau tema bicara kembali ke lisensi manager untuk update.

Ketika membuat plugin, di bagian pertama ini, Anda akan belajar tentang teknik pengembangan plugin WordPress berikut:

  • Menggunakan WordPress Plugin Boilerplate untuk memulai dengan cepat.
  • Membuat custom post type baru dengan meta box untuk menyimpan custom meta data.
  • Membuat tabel database maintainable untuk plugin Anda.
  • Menambahkan item ke tabel database.
  • Daftar item menggunakan WordPress sendiri daftar tabel implementasi.

Jika Anda ingin melihat plugin bekerja, Anda dapat men-download versi terbaru dari plugin dari WordPress.org. Untuk kode sumber yang tepat digunakan dalam tutorial ini, Periksa repositori Tuts+ Github terkait (di sebelah kanan). Kita akan pergi melalui setiap langkah dari membuat plugin satu per satu, tetapi jika Anda tidak ingin membangun segala sesuatu dari awal, mengikuti bersama dengan kode sumber adalah cara yang baik untuk mengatur belajar Anda.

Sekarang, mari kita mendapatkan untuk bekerja.

1. Buat Plugin yang menggunakan Boilerplate WordPress Plugin

Memulai dengan plugin WordPress baru terdiri dari banyak berulang-ulang pekerjaan yang Anda lakukan berulang-ulang dengan setiap plugin yang Anda buat, seperti menulis kode baru atau menyalin dan membersihkan proyek lama.

Tapi ada cara yang lebih baik.

Saat ini, daripada menyalin proyek yang sudah ada atau memulai dari awal, kita akan menggunakan Tom McFarlin WordPress Plugin Boilerplate, titik awal yang dirancang untuk mendapatkan Anda mulai dengan sebuah plugin WordPress yang terstruktur dengan baik, berorientasi objek dalam waktu singkat.

Jadi, sebelum kita mulai menambahkan fungsi kita sendiri, mari kita mengatur plugin dasar yang menggunakan plugin boilerplate.

Download Boilerplate dan membuat Anda sendiri

Cara termudah untuk men-download plugin boilerplate adalah untuk mengunjungi situs web proyek dan download versi terbaru sebagai zip file.

Setelah Anda download dan membongkar paket zip, Letakkan map trunk folder di dalamnya, salin ke lokasi pilihan Anda dan mengubah nama wp-license-manager.

Kemudian, saatnya untuk pergi melalui plugin boilerplate file dan membuat mereka sendiri:

  1. Pergi melalui semua file dalam direktori plugin (dan subdirektorinya) mengganti semua kemunculan plugin-name ke wp-license-manager dan Plugin_Name untuk Wp_License_Manager. Pastikan untuk mengubah nama class dan file yang mengandung mereka. Ini akan mengambil sedikit waktu dan pekerjaan manual, jadi menggunakan PHP IDE untuk membantu dalam mengubah nama adalah ide yang baik.
  2. Tambahkan informasi plugin plugin bootstrap file, sekarang disebut wp‑license-manager.php dan terletak di direktori root plugin. Anda akan menemukan informasi dalam komentar blok di bagian atas file, tepat setelah PHPDoc tag @wordpress-plugin.

Sekarang, Anda telah menciptakan plugin kosong dengan beberapa konfigurasi dasar, dan itu hanya menunggu Anda untuk mulai menambahkan fungsionalitas. Sudah waktunya untuk membangun manajer lisensi kami!

Jika Anda ingin membaca lebih lanjut tentang menggunakan boilerplate, memeriksa seri tutorial Tom McFarlin, mengembangkan plugin dengan WordPress Boilerplates. Ini didasarkan pada versi sebelumnya boilerplate, tetapi masih akan memberi Anda pemahaman yang lebih dalam ide di balik plugin boilerplate dan bekerja dengan salah satu.

2. membuat Custom Post Type untuk produk

lisensi manajer kita plugin cukup sederhana dan akan menyimpan dan menggunakan hanya dua jenis data: products dan licenses. Sebagai produk diperlukan untuk menciptakan lisensi (dan produk yang mudah dari dua), itu adalah dimana kita akan mulai.

Berikut adalah apa yang akan Anda membangun dalam bagian ini:

WordPress plugin screenshotWordPress plugin screenshotWordPress plugin screenshot

product akan mewakili WordPress plugin atau tema yang Anda ingin mengelola melalui server manajer lisensi. Seperti posting blog atau page, product memiliki nama dan deskripsi. Selain itu, memiliki beberapa bidang tambahan untuk menentukan produk informasi spesifik:

  • Version: Nomor versi produk. Bidang ini akan digunakan untuk memeriksa pembaruan di bagian dua dan tiga seri tutorial ini.
  • File bucket: The Amazon S3 bucket di mana file akan disimpan.
  • File name: nama file zip produk disimpan di Amazon S3. Kita akan berbicara tentang pilihan file ini di bagian kedua dari seri.
  • Diuji dengan versi WordPress, WordPress memerlukan versi, terakhir diperbarui, tinggi Banner, dan Banner rendah: pilihan ini akan ditampilkan dalam plugin update UI dalam bagian ketiga dari seri tutorial.

Sekarang, mari kita membangun ini dengan menciptakan custom post type dan menambahkan meta box.

Langkah 1: Buat Post Type

Plugin boilerplate membagi fungsi plugin secara logis menjadi dua bagian: Umum menghadapi fungsi dan fungsi admin. Sementara pemisahan ini masuk akal dalam kebanyakan kasus, post type adalah suatu tempat di antara, dan Anda bisa berpendapat untuk menempatkan mereka di salah satu dari dua. Aku memutuskan untuk pergi dengan publik.

Jadi, mencari fungsi define_public_hooks di dalam class Wp_License_Manager includes/class-wp-license-manager.php, dan menambahkan action baru berikut tepat setelah dua action wp_enqueue_scripts yang sudah ada:

1
$this->loader->add_action( 'init', $plugin_public, 'add_products_post_type' );

Baris ini menggunakan boilerplate action dan filter loader untuk menambahkan sebuah action handler ke WordPress action init. Fungsi, add_products_post_type, pergi ke class Wp_License_Manager_Public.

Berikut adalah seluruh fungsi:

1
/**

2
 * Register the new "products" post type to use for products that

3
 * are available for purchase through the license manager.

4
 */
5
public function add_products_post_type() {
6
    register_post_type( 'wplm_product',
7
        array(
8
            'labels' => array(
9
                'name' => __( 'Products', $this->plugin_name ),
10
                'singular_name' => __( 'Product', $this->plugin_name ),
11
                'menu_name' => __( 'Products', $this->plugin_name ),
12
                'name_admin_bar' => __( 'Products', $this->plugin_name ),
13
                'add_new' => __( 'Add New', $this->plugin_name ),
14
                'add_new_item' => __( 'Add New Product', $this->plugin_name ),
15
                'edit_item' => __( 'Edit Product', $this->plugin_name ),
16
                'new_item' => __( 'New Product', $this->plugin_name ),
17
                'view_item' => __( 'View Product', $this->plugin_name ),
18
                'search_item' => __( 'Search Products', $this->plugin_name ),
19
                'not_found' => __( 'No products found', $this->plugin_name ),
20
                'not_found_in_trash' => __( 'No products found in trash', $this->plugin_name ),
21
                'all_items' => __( 'All Products', $this->plugin_name ),
22
            ),
23
            'public' => true,
24
            'has_archive' => true,
25
            'supports' => array( 'title', 'editor', 'author', 'revisions', 'thumbnail' ),
26
            'rewrite' => array( 'slug' => 'products' ),
27
            'menu_icon' => 'dashicons-products',
28
        )
29
    );
30
}

Mari kita pergi melalui fungsi dan apa yang dilakukannya — dengan kata lain, parameter ke WordPress fungsi register_post_type.

Parameter pertama, $post_type, (baris 6) mendefinisikan pengenal dari post type yang digunakan di WordPress admin link dan query post type ini (aku pergi dengan wplm_product untuk menjaga dari bertabrakan dengan post type yang dibuat oleh plugin dan tema lain).

Parameter kedua (baris 7 – 28) adalah sebuah array yang mendefinisikan sifat post type (untuk daftar lengkap pilihan yang dapat Anda gunakan, periksa WordPress Codex):

  • label mendefinisikan sebuah set string label digunakan untuk merujuk kepada post type di WordPress admin area.
  • public mendefinisikan visibilitas post type baru ini. Saya ingin produk harus ditelusuri oleh orang-orang yang mengunjungi situs sehingga saya menetapkan ini ke true. Jika, di sisi lain, Anda ingin menyimpan produk hal yang private, hanya menyetel opsi ini ke false.
  • has_archive menetapkan apakah WordPress menyajikan halaman arsip untuk daftar posting jenis ini atau tidak.
  • supports mendefinisikan fitur mengedit post yang ditampilkan di post editor.
  • rewrite mendefinisikan bagaimana permalinks untuk jenis produk ini akan terlihat.
  • menu_icon menentukan ikon untuk menggunakan jenis post di admin menu. Kunjungi situs WordPress pengembang untuk daftar lengkap dari dashboard ikon yang tersedia.

Daftar, menambahkan dan mengedit produk semuanya sekarang ditangani oleh WordPress. Apa yang tersisa untuk kita lakukan adalah menambahkan meta box dengan pengaturan kustom yang tercantum di atas.

Langkah 2: Tambahkan Meta box untuk informasi produk

Sekarang bahwa kita telah menciptakan custom post type untuk produk, kami memiliki segala sesuatu yang kita butuhkan untuk menyimpan produk dalam sistem manajemen lisensi. Tetapi untuk membuat jenis post lebih bermanfaat, mari kita lanjutkan dengan menambahkan meta box untuk informasi produk tertentu.

Berikut adalah apa yang meta box akan terlihat sepert apai:

Meta box for Product Information

Pertama, mari kita mengambil action untuk menambahkan meta box. add_meta_boxes_ {post_type} merupakan pilihan bagus: cukup tambahkan post type {post_type} dan action Anda akan dipanggil ketika saatnya untuk menambahkan meta box untuk post ini diberikan jenis (dalam kasus kami, wplm_product).

Seperti yang kita kerjakan admin area, tambahkan kode berikut dalam define_admin_hooks() fungsi di dalam class utama plugin Wp_License_Manager:

1
$this->loader->add_action( 'add_meta_boxes_wplm_product', $plugin_admin, 'add_product_information_meta_box' );

Fungsi, add_product_information_meta_box() di Wp_License_Manager_Admin, hanya mendefinisikan meta box dan fungsi render untuk menampilkan isinya:

1
/**

2
 * Registers a meta box for entering product information. The meta box is

3
 * shown in the post editor for the "product" post type.

4
 *

5
 * @param   $post   WP_Post The post object to apply the meta box to

6
 */
7
public function add_product_information_meta_box( $post ) {
8
    add_meta_box(
9
        'product-information-meta-box',
10
        __( 'Product Information', $this->plugin_name ),
11
        array( $this, 'render_product_information_meta_box' ),
12
        'wplm_product',
13
        'side'
14
    );
15
}

Fungsi berisi hanya panggilan untuk add_meta_box fungsi WordPress yang akan menentukan meta box. Parameter dalam urutan tampilan adalah sebagai berikut:

  1. $id: nilai bidang id HTML untuk elemen meta box.
  2. $title: judul meta box, di atas box.
  3. $callback: fungsi yang akan melakukan render meta box.
  4. $post_type: jenis posting Editor Halaman di mana meta box ini harus ditampilkan.
  5. $context: mana meta box harus ditempatkan ('normal', 'advanced', atau 'side').

Selanjutnya, tambahkan fungsi render yang kami didefinisikan dalam parameter ketiga:

1
/**

2
 * Renders the product information meta box for the given post (wplm_product).

3
 *

4
 * @param $post     WP_Post     The WordPress post object being rendered.

5
 */
6
public function render_product_information_meta_box( $post ) {
7
    $product_meta = get_post_meta( $post->ID, 'wp_license_manager_product_meta', true );
8
9
    if ( ! is_array( $product_meta ) ) {
10
        $product_meta = array(
11
            'file_bucket' => '',
12
            'file_name' => '',
13
            'version' => '',
14
            'tested' => '',
15
            'requires' => '',
16
            'updated' => '',
17
            'banner_low' => '',
18
            'banner_high' => ''
19
        );
20
    }
21
22
    $this->render_nonce_field( 'product_meta_box' );
23
24
    require( 'partials/product_meta_box.php' );
25
}

Baris 7: Fungsi mulai dengan membaca data meta saat ini.

Baris 9 – 20: jika meta data kosong (itu adalah pada titik ini, benar-benar...), membuat sebuah array data meta default dengan nilai-nilai kosong.

Baris 22: Mencetak bidang kesempatan ini yang akan digunakan untuk keamanan tambahan beberapa saat menyimpan meta data. render_nonce_field adalah fungsi pembantu yang saya buat untuk membantu saya dengan mengingat nama nonce's. Kami akan menambahkannya dalam beberapa saat.

Baris 24: Termasuk meta box sebenarnya HTML. Direktori partials yang merupakan bagian dari WordPress plugin boilerplate dan dimaksudkan untuk memisahkan kode HTML dari PHP. Berikut adalah bagaimana file template untuk meta bo harus:

1
<?php
2
/**

3
 * The view for the plugin's product meta box. The product meta box is used for

4
 * entering additional product information (version, file bucket, file name).

5
 *

6
 * @package    Wp_License_Manager

7
 * @subpackage Wp_License_Manager/admin/partials

8
 */
9
?>
10
<p>
11
    <label for="wp_license_manager_product_version">
12
        <?php _e( 'Version:', $this->plugin_name ); ?>
13
    </label>
14
    <input type="text" id="wp_license_manager_product_version"
15
           name="wp_license_manager_product_version"
16
           value="<?php echo esc_attr( $product_meta['version'] ); ?>"
17
           size="25" >
18
</p>
19
<p>
20
    <label for="wp_license_manager_product_tested">
21
        <?php _e( 'Tested with WordPress version:', $this->plugin_name ); ?>
22
    </label>
23
    <input type="text" id="wp_license_manager_product_tested"
24
           name="wp_license_manager_product_tested"
25
           value="<?php echo esc_attr( $product_meta['tested'] ); ?>"
26
           size="25" >
27
</p>
28
<p>
29
    <label for="wp_license_manager_product_requires">
30
        <?php _e( 'Requires WordPress version:', $this->plugin_name ); ?>
31
    </label>
32
    <input type="text" id="wp_license_manager_product_requires"
33
           name="wp_license_manager_product_requires"
34
           value="<?php echo esc_attr( $product_meta['requires'] ); ?>"
35
           size="25" >
36
</p>
37
<p>
38
    <label for="wp_license_manager_product_updated">
39
        <?php _e( 'Last updated:', $this->plugin_name ); ?>
40
    </label>
41
    <input type="text" id="wp_license_manager_product_updated"
42
           name="wp_license_manager_product_updated"
43
           value="<?php echo esc_attr( $product_meta['updated'] ); ?>"
44
           size="25" >
45
</p>
46
47
<p>
48
    <label for="wp_license_manager_product_banner_low">
49
        <?php _e( 'Banner low:', $this->plugin_name ); ?>
50
    </label>
51
    <input type="text" id="wp_license_manager_product_banner_low"
52
           name="wp_license_manager_product_banner_low"
53
           value="<?php echo esc_attr( $product_meta['banner_low'] ); ?>"
54
           size="25" >
55
</p>
56
57
<p>
58
    <label for="wp_license_manager_product_banner_high">
59
        <?php _e( 'Banner high:', $this->plugin_name ); ?>
60
    </label>
61
    <input type="text" id="wp_license_manager_product_banner_high"
62
           name="wp_license_manager_product_banner_high"
63
           value="<?php echo esc_attr( $product_meta['banner_high'] ); ?>"
64
           size="25" >
65
</p>
66
67
<h3>Download</h3>
68
69
<p>
70
    <label for="wp_license_manager_product_bucket">
71
        <?php _e( 'Amazon S3 Bucket:', $this->plugin_name ); ?>
72
    </label>
73
    <input type="text" id="wp_license_manager_product_bucket"
74
           name="wp_license_manager_product_bucket"
75
           value="<?php echo esc_attr( $product_meta['file_bucket'] ); ?>"
76
           size="25" />
77
</p>
78
<p>
79
    <label for="wp_license_manager_product_file_name">
80
        <?php _e( 'Amazon S3 File Name:', $this->plugin_name ); ?>
81
    </label>
82
    <input type="text" id="wp_license_manager_product_file_name"
83
           name="wp_license_manager_product_file_name"
84
           value="<?php echo esc_attr( $product_meta['file_name'] ); ?>"
85
           size="25" />
86
</p>

Template adalah agak sederhana HTML, serangkaian label yang diikuti oleh elemen-elemen input dengan nilai-nilai mereka membaca dari $product_meta array kita diperoleh dalam fungsi di atas.

Sekarang, dengan meta box dibuat, mari kita mengurus menyimpan datanya.

Langkah 3: Simpan Meta box Data

Seperti Anda mungkin telah menyadari oleh sekarang, ketika mengembangkan sebuah plugin, menambahkan potongan fungsionalitas baru selalu dimulai dengan menemukan tindakan cocok atau filter untuk itu.

Hal ini berlaku juga untuk menyimpan data meta box.

Kali ini, action untuk menghubungkan ke hook adalah save_post, suatu action yang diaktifkan setiap kali post disimpan dalam WordPress admin. Sekali lagi, dalam class Wp_License_Manager dan define_admin_hooks() fungsi nya, tambahkan baris baru:

1
$this->loader->add_action( 'save_post', $plugin_admin, 'save_product_information_meta_box' );

Fungsi, save_product_information_meta_box, berjalan di class Wp_License_Manager_Admin:

1
/**

2
 * Saves the product information meta box contents.

3
 *

4
 * @param $post_id  int     The id of the post being saved.

5
 */
6
public function save_product_information_meta_box( $post_id ) {
7
    if ( ! $this->is_nonce_ok( 'product_meta_box' ) ) {
8
        return $post_id;
9
    }
10
11
    // Ignore auto saves

12
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
13
        return $post_id;
14
    }
15
16
    // Check the user's permissions

17
    if ( !current_user_can( 'edit_posts', $post_id ) ) {
18
        return $post_id;
19
    }
20
21
    // Read, sanitize, and store user input

22
    $meta = get_post_meta( $post_id, 'wp_license_manager_product_meta', true );
23
    if ( $meta == '' ) {
24
        $meta = array();
25
    }
26
27
    $meta['file_bucket'] = sanitize_text_field( $_POST['wp_license_manager_product_bucket'] );
28
    $meta['file_name'] = sanitize_text_field( $_POST['wp_license_manager_product_file_name'] );
29
    $meta['version'] = sanitize_text_field( $_POST['wp_license_manager_product_version'] );
30
    $meta['tested'] = sanitize_text_field( $_POST['wp_license_manager_product_tested'] );
31
    $meta['requires'] = sanitize_text_field( $_POST['wp_license_manager_product_requires'] );
32
    $meta['updated'] = sanitize_text_field( $_POST['wp_license_manager_product_updated'] );
33
    $meta['banner_low'] = sanitize_text_field( $_POST['wp_license_manager_product_banner_low'] );
34
    $meta['banner_high'] = sanitize_text_field( $_POST['wp_license_manager_product_banner_high'] );
35
36
    // Update the meta field

37
    update_post_meta( $post_id, 'wp_license_manager_product_meta', $meta );
38
}

Mari kita pergi melalui fungsi untuk melihat apa yang dilakukan:

  • baris 7-9: seperti yang Anda ingat, kami menambahkan bidang kesempatan ini tepat sebelum render meta box produk. Dalam fungsi ini, kita menggunakan kesempatan ini bahwa untuk memverifikasi bahwa orang yang pst data datang dari form (kami akan menambahkan fungsi is_nonce_ok segera).
  • Baris 11-14: Jangan Simpan meta box data ketika WordPress adalah melakukan auto periodik yang menyelamatkan. Ini adalah karena secara default, WordPress tidak memasukan meta box data ketika membuat panggilan AJAX dilakukan autosave, dan memperbarui meta box data pada saat itu akan mengacaukan segalanya.
  • Baris 16-19: hanya memungkinkan menyimpan data jika pengguna dapat mengedit post. Satu hal yang perlu dipertimbangkan di masa depan akan menambahkan kemampuan kustom untuk mengedit lisensi manajer produk.
  • Baris 22-25: membaca produk meta data yang ada, atau membuat array data baru jika tidak ada meta data yang belum disimpan (get_post_meta mengembalikan string kosong ketika meta data item tidak ditemukan dan parameter ketiga diatur ke true).
  • Baris 27-34: membaca data yang disubmit, melakukan beberapa sanitasi dasar.
  • Baris 37: Segala sesuatu adalah OK, menyimpan data.

Sekarang, sebelum kita melanjutkan ke lisensi, mari kita melakukan itu satu hal terakhir saya telah janjikan dan menambahkan fungsi helper untuk rendering dan memverifikasi meta box nonce.

Pertama, menciptakan satu:

1
/**

2
 * A helper function for creating and rendering a nonce field.

3
 *

4
 * @param   $nonce_label  string  An internal (shorter) nonce name

5
 */
6
private function render_nonce_field( $nonce_label ) {
7
    $nonce_field_name = $this->plugin_name . '_' . $nonce_label . '_nonce';
8
    $nonce_name = $this->plugin_name . '_' . $nonce_label;
9
10
    wp_nonce_field( $nonce_name, $nonce_field_name );
11
}

Inti dari fungsi ini adalah panggilan untuk wp_nonce_field yang melakukan pekerjaan yang sebenarnya menciptakan one-time token digunakan untuk kesempatan dan menulis itu keluar dalam bidang HTML tersembunyi.

Kemudian, cek:

1
/**

2
 * A helper function for checking the product meta box nonce.

3
 *

4
 * @param   $nonce_label string  An internal (shorter) nonce name

5
 * @return  mixed   False if nonce is not OK. 1 or 2 if nonce is OK (@see wp_verify_nonce)

6
 */
7
private function is_nonce_ok( $nonce_label ) {
8
    $nonce_field_name = $this->plugin_name . '_' . $nonce_label . '_nonce';
9
    $nonce_name = $this->plugin_name . '_' . $nonce_label;
10
11
    if ( ! isset( $_POST[ $nonce_field_name ] ) ) {
12
        return false;
13
    }
14
15
    $nonce = $_POST[ $nonce_field_name ];
16
17
    return wp_verify_nonce( $nonce, $nonce_name );
18
}

nonce memeriksa fungsi menggunakan konvensi penamaan yang sama dari fungsi di atas, dan kemudian menggunakan mereka untuk mengambil nonce dari data form yag dikirim (baris 11-15). Kemudian, jika kesempatan ini ditemukan, ia menggunakan WordPress fungsi wp_verify_nonce untuk memeriksa bahwa kode yang diajukan sesuai yang disimpan satu (baris 17).

3. Tambahkan lisensi

Kami sekarang setengah jalan melalui tutorial ini pertama dalam seri: produk di tempat dan sudah waktunya untuk mengambil melihat lisensi.

Lisensi pada yang paling sederhana terdiri dari dua elemen: kunci lisensi dan id pengguna (kami akan menggunakan alamat email untuk itu). Untuk lebih banyak kontrol atas lisensi, kami juga menambahkan elemen ketiga: lisensi kedaluwarsa, tanggal setelah lisensi ini tidak berlaku lagi dan tidak akan menerima update dari server kami manajer lisensi.

Admin UI untuk lisensi akan cukup mirip dengan yang kita dibuat untuk produk: Daftar lisensi dan pilihan untuk membuat yang baru. Implementasi, namun, akan sangat berbeda: sementara produk sesuai metafora post baik dan karena itu natural untuk menerapkan sebagai custom post type, lisensi terbaik diimplementasikan menggunakan tabel database mereka sendiri.

Langkah 1: Buat tabel Database

Bangunan lisensi fungsi dimulai dengan membuat tabel database yang akan memegang lisensi. Waktu yang paling natural untuk membuat tabel database baru tepat di Aktivasi plugin, sebelum pengguna memiliki kesempatan untuk mencoba dan melakukan sesuatu dengan tabel.

WordPress Plugin Boilerplate membuat ini mudah dengan menyediakan fungsi kosong yang kita dapat mulai menulis kode kita. Fungsi, activate, di class Wp_License_Manager_Activator, dipangil setiap kali plugin diaktifkan, baik dengan mengklik Activate dalam menu Plugins atau ketika sebuah plugin update selesai.

Pertama, tambahkan definisi variabel berikut di bagian atas class:

1
/**
2
 * The database version number. Update this every time you make a change to the database structure.
3
 *
4
 * @access   protected
5
 * @var      string    $db_version   The database version number
6
 */
7
protected static $db_version = 1;

Dan kemudian, memperbarui fungsi aktivasi dengan kode berikut:

1
/**

2
 * Code that is run at plugin activation.

3
 */
4
public static function activate() {
5
    // Update database if db version has increased

6
    $current_db_version = get_option( 'wp-license-manager-db-version' );
7
    if ( ! $current_db_version ) {
8
        $current_db_version = 0;
9
    }
10
11
    if ( intval( $current_db_version ) < Wp_License_Manager_Activator::$db_version ) {
12
        if ( Wp_License_Manager_Activator::create_or_upgrade_db() ) {
13
            update_option( 'wp-license-manager-db-version', Wp_License_Manager_Activator::$db_version );
14
        }
15
    }
16
}

Berikut adalah apa yang dilakukan:

Baris 6 – 9: membaca dalam pilihan wp-lisensi-manager-db-version. Kami akan menggunakan opsi ini untuk menyimpan plugin database versi saat ini aktif di situs.

Baris 11: Bandingkan versi database saat ini dengan yang didefinisikan dalam plugin atas basis kode ($db_version, definisi di atas). Jika set nomor versi dalam kode plugin lebih tinggi daripada yang disimpan dalam pilihan WordPress, database update yang diperlukan.

Baris 12: Jalankan database update.

Baris 13: Jika database update berhasil, memperbarui opsi wp-lisensi-manager-db-version yang sesuai dengan versi dalam kode.

Sekarang, kami telah menciptakan sebuah sistem untuk melacak versi database dan dapat pindah ke membuat tabel database. Tambahkan fungsi berikut untuk Wp_License_Manager_Activator:

1
/**

2
 * Creates the database tables required for the plugin if 

3
 * they don't exist. Otherwise updates them as needed.

4
 *

5
 * @return bool true if update was successful.

6
 */
7
private static function create_or_upgrade_db() {
8
    global $wpdb;
9
10
    $table_name = $wpdb->prefix . 'product_licenses';
11
        
12
    $charset_collate = '';
13
    if ( ! empty( $wpdb->charset ) ) {
14
        $charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset}";
15
    }
16
    if ( ! empty( $wpdb->collate ) ) {
17
        $charset_collate .= " COLLATE {$wpdb->collate}";
18
    }
19
20
    $sql = "CREATE TABLE " . $table_name . "("
21
         . "id mediumint(9) NOT NULL AUTO_INCREMENT, "
22
         . "product_id mediumint(9) DEFAULT 0 NOT NULL,"
23
         . "license_key varchar(48) NOT NULL, "
24
         . "email varchar(48) NOT NULL, " 
25
         . "valid_until datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, "
26
         . "created_at datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, "
27
         . "updated_at datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, "
28
         . "UNIQUE KEY id (id)"
29
         . ")" . $charset_collate. ";";
30
31
    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
32
    dbDelta( $sql );
33
34
    return true;
35
}

Sebagian besar fungsi ini adalah tentang menciptakan query SQL CREATE TABLE yang kita akan gunakan untuk membuat tabel database:

Baris 10: Membangun nama tabel database.

Baris 12 – 18: beberapa definisi charset yang akan digunakan dalam SQL.

Baris 20-29: The SQL untuk query CREATE TABLE. Tabel akan memiliki kolom berikut:

  • id: id yang unik untuk baris lisensi.
  • product_id: id dari produk yang terkait lisensi.
  • license_key: kunci lisensi string digunakan sebagai password.
  • email: alamat email pemilik lisensi, yang bekerja sebagai nama pengguna.
  • valid_until: tanggal kedaluwarsa lisensi.
  • created_at: timestamp Kapan lisensi diciptakan.
  • updated_at: timestamp update terbaru.

Baris 31-32: Gunakan WordPress database update metode dbDelta untuk membuat atau memperbarui tabel database. Perhatikan bahwa dbDelta tidak benar-benar menjalankan query CREATE TABLE, tapi menganalisis itu dan membandingkannya kepada struktur tabel saat ini, melakukan modifikasi yang diperlukan.

Jadi, kemudian, jika Anda memutuskan untuk membuat perubahan pada struktur tabel, alih-alih menulis query SQL baru, Anda akan hanya mengedit query CREATE TABLE, memperbarui $db_version parameter dan membiarkan dbDelta menangani sisanya.

Untuk informasi lebih lanjut tentang membuat tabel database di WordPress dan menggunakan dbDelta, baca artikel menciptakan tabel dengan plugin di WordPress codex.

Dan hanya itu. Waktu berikutnya Anda mengaktifkan plugin, tabel database untuk lisensi akan dibuat. Jika Anda sudah mengaktifkan plugin, Anda harus melakukannya lagi (menonaktifkan dan kemudian mengaktifkan lagi) untuk membuat database.

Langkah 2: Buat halaman Menu lisensi

Sekarang bahwa kita telah membuat tabel database untuk menyimpan lisensi, mari kita membuat menu Halaman: "Licenses" dan "Add New".

Sekali lagi, kita mulai dengan mengaitkan untuk action yang tepat dalam fungsi Wp_License_Manager di define_admin_hooks:

1
$this->loader->add_action( 'admin_menu', $plugin_admin, 'add_licenses_menu_page' );

Fungsi action, add_license_menu_page, pergi ke Wp_License_Manager_Admin dan tampak seperti ini:

1
/**

2
 * Creates the settings menu and sub menus for adding and listing licenses.

3
 */
4
public function add_licenses_menu_page() {
5
    add_menu_page(
6
        __( 'Licenses', $this->plugin_name ),
7
        __( 'Licenses', $this->plugin_name ),
8
        'edit_posts',
9
        'wp-licenses',
10
        array( $this, 'render_licenses_menu_list' ),
11
        'dashicons-lock',
12
        '26.1'
13
    );
14
15
    add_submenu_page(
16
        'wp-licenses',
17
        __( 'Licenses', $this->plugin_name ),
18
        __( 'Licenses', $this->plugin_name ),
19
        'edit_posts',
20
        'wp-licenses',
21
        array( $this, 'render_licenses_menu_list' )
22
    );
23
24
    add_submenu_page(
25
        'wp-licenses',
26
        __( 'Add new', $this->plugin_name ),
27
        __( 'Add new', $this->plugin_name ),
28
        'edit_posts',
29
        'wp-licenses-new',
30
        array( $this, 'render_licenses_menu_new' )
31
    );
32
}

Mari kita lihat lebih dekat:

Baris 5-13: membuat halaman menu tingkat atas, dengan judul, "Licenses". Fungsi, add_menu_page, mengambil parameter berikut:

  1. $page_title: judul halaman menu (nilai tag judul HTML).
  2. $menu_title: layar judul untuk halaman menu.
  3. $capability: kemampuan yang diperlukan untuk melihat halaman. Saya menggunakan edit_posts, tetapi di masa depan, saya mungkin akan mempertimbangkan menambahkan kemampuan saya sendiri di tempatnya.
  4. $menu_slug: pengenal untuk halaman menu, yang digunakan di URL laman.
  5. $function: fungsi yang akan menangani render halaman menu ini.
  6. $icon_url: bidang ini dapat digunakan dalam banyak cara yang berbeda, tapi aku memilih untuk pergi dengan ikon dashboard seperti dijelaskan sebelumnya dalam tutorial ini.
  7. $position: penempatan menu item dalam WordPress menu. Masalah dengan menggunakan parameter ini adalah bahwa jika dua item menu memiliki nilai $position yang sama, hanya salah satu dari mereka akan ditampilkan. Menurut dokumentasi WordPress, menggunakan desimal nomor, seperti yang telah kita lakukan di sini, membantu sedikit.

Baris 15 – 22: menambahkan submenu untuk daftar lisensi. Parameter untuk add_submenu_page tidak sama untuk add_menu_page tetapi parameter pertama harus id dari menu paling atas yang submenu harus ditambahkan.

Juga harus diingat adalah bahwa kita arahkan submenu pertama untuk fungsi menu paling atas action yang sama. Apa yang dilakukan adalah bahwa ketika pengguna mengklik pada menu tingkat atas, submenu ini pertama dibuka segera.

Baris 24-31: submenu kedua adalah yang kita akan mulai dengan, halaman untuk menambahkan lisensi baru.

Untuk membuat kode berjalan tanpa kesalahan, tambahkan dua fungsi kosong:

1
public function render_licenses_menu_list() {
2
3
}
4
5
public function render_licenses_menu_new() {
6
7
}

Step 3: Membuat Halaman Add New License

Dengan dua pengaturan halaman dibuat, mari kita menambahkan fungsionalitas ke yang pertama, "Add New License" halaman.

Halaman yang akan terlihat seperti ini:

Add New License pageAdd New License pageAdd New License page

Sebagaimana kita didefinisikan di atas, fungsi yang akan melakukan render untuk menambahkan Add new page yang disebut render_licenses_menu_new. Fungsi itu sendiri sederhana, dengan sebagian besar jalur yang dihabiskan mempopulasikan daftar produk yang akan digunakan untuk rendering daftar drop-down:

1
/**

2
 * Renders the list add new license menu page using 

3
 * the "licenses_new.php" partial.

4
 */
5
public function render_licenses_menu_new() {
6
    // Used in the "Product" drop-down list in view

7
    $products = get_posts(
8
        array(
9
            'orderby'           => 'post_title',
10
            'order'             => 'ASC',
11
            'post_type'         => 'wplm_product',
12
            'post_status'       => 'publish',
13
            'nopaging'          => true,
14
            'suppress_filters'  => true
15
        )
16
    );
17
18
    require plugin_dir_path( dirname( __FILE__ ) ) . 'admin/partials/licenses_new.php';
19
}

Baris 7 – 16: mengambil semua diterbitkan post dari wplm_product custom type kami.

Baris 18: Termasuk parsial yang mengandung HTML untuk halaman menu ini.

Dan inilah apa yang terjadi dalam HTML template:

1
<?php
2
/**

3
 * The view for the admin page used for adding a new license.

4
 *

5
 * @package    Wp_License_Manager

6
 * @subpackage Wp_License_Manager/admin/partials

7
 */
8
?>
9
<div class="wrap">
10
    <div id="icon-edit" class="icon32 icon32-posts-post"></div>
11
12
    <h2><?php _e( 'Add New License', $this->plugin_name ); ?></h2>
13
    <p>
14
        <?php
15
            $instructions = 'Use this form to manually add a product license. '
16
                . 'After completing the process, make sure to pass the license key to the customer.';
17
18
            _e( $instructions, $this->plugin_name );
19
        ?>
20
    </p>
21
22
    <form action="<?php echo admin_url( 'admin-post.php' ); ?>" method="post">
23
        <?php wp_nonce_field( 'wp-license-manager-add-license', 'wp-license-manager-add-license-nonce' ); ?>
24
        <input type="hidden" name="action" value="license_manager_add_license">
25
26
        <table class="form-table">
27
            <tr class="form-field form-required">
28
                <th scope="row">
29
                    <label for="email">
30
                        <?php _e( 'Email', $this->plugin_name ); ?>
31
                        <span class="description"><?php _e( '(required)', $this->plugin_name ); ?></span>
32
                    </label>
33
                </th>
34
                <td>
35
                    <input name="email" type="text" id="email" aria-required="true">
36
                </td>
37
            </tr>
38
            <tr class="form-field form-required">
39
                <th scope="row">
40
                    <label for="email">
41
                        <?php _e( 'Product', $this->plugin_name ); ?>
42
                        <span class="description"><?php _e( '(required)', $this->plugin_name ); ?></span>
43
                    </label>
44
                </th>
45
                <td>
46
                    <select name="product" id="product" aria-required="true">
47
                        <?php foreach ( $products as $product ) : ?>
48
                            <option value="<?php echo $product->ID; ?>"><?php echo $product->post_title; ?></option>
49
                        <?php endforeach; ?>
50
                    </select>
51
                </td>
52
            </tr>
53
            <tr class="form-field form-required">
54
                <th scope="row">
55
                    <label for="valid_until">
56
                        <?php _e( 'Valid until', $this->plugin_name ); ?>
57
                    </label>
58
                </th>
59
                <td>
60
                    <input name="valid_until" type="text" id="valid_until" aria-required="false" />
61
                    <p class="description">
62
                        <?php _e( '(Format: YYYY-MM-DD HH:MM:SS / Leave empty for infinite)', $this->plugin_name );?>
63
                    </p>
64
                </td>
65
            </tr>
66
        </table>
67
68
        <p class="submit">
69
            <input type="submit" name="add-license" class="button button-primary"
70
                   value="<?php _e( 'Add License', $this->plugin_name ); ?>" >
71
        </p>
72
    </form>
73
74
</div>

Ini adalah fprm agak dasar, menggunakan beberapa CSS class yang didefinisikan di WordPress admin untuk membuat segalanya tampak cara WordPress admin layar seharusnya untuk melihat.

Beberapa baris yang Anda harus memperhatikan adalah:

Baris 22: Ketika pengguna mengirimkan form, itu akan post ke WordPress admin-post.php.

baris 23: Hanya seperti dengan meta box, tambahkan nonce ini untuk memastikan bahwa seseorang post untuk menambah lisensi adalah benar-benar melakukannya melalui halaman ini.

Baris 24: Menentukan bidang tersembunyi bernama action dengan nilai 'license_manager_add_license'. Bidang ini akan digunakan untuk menambahkan fungsi penanganan form pengajuan — kita akan mendapatkan ini berikutnya.

Langkah 4: Menyimpan lisensi

Di langkah sebelumnya, kami membuat formulir "Add New License". Sekarang adalah waktu untuk membuat fungsi untuk menyimpannya.

Kembali ke fungsi define_admin_hooks di Wp_License_Manager dan menambahkan action baru:

1
$this->loader->add_action( 'admin_post_license_manager_add_license', $plugin_admin, 'handle_add_license' );

Saat ini, kita menggunakan admin_post_ {action}, action yang pintar untuk menangani form kustom.

Ketika form dengan action bidang tersembunyi yang dikirim, WordPress mencari bidang nilai dan menggunakan ini untuk membuat memanggil action yang cocok. Nilai yang kita digunakan untuk bidang tersembunyi adalah "license_manager_add_license" dan sehingga kita dapat menambahkan action dengan nama admin_post_license_manager_add_license.

Fungsi, handle_add_license, pergi ke Wp_License_Manager_Admin:

1
/**

2
 * Handler for the add_license action (submitting 

3
 * the "Add New License" form).

4
 */
5
public function handle_add_license() {
6
    global $wpdb;
7
8
    if ( ! empty( $_POST )
9
        && check_admin_referer( 'wp-license-manager-add-license', 
10
            'wp-license-manager-add-license-nonce' ) ) {
11
12
        // Nonce valid, handle data

13
14
        $email = sanitize_text_field( $_POST['email'] );
15
        $valid_until = sanitize_text_field( $_POST['valid_until'] );
16
        $product_id = intval( $_POST['product'] );
17
        
18
        $license_key = wp_generate_password( 24, true, false );
19
20
        // Save data to database

21
        $table_name = $wpdb->prefix . 'product_licenses';
22
        $wpdb->insert(
23
            $table_name,
24
            array(
25
                'product_id' => $product_id,
26
                'email' => $email,
27
                'license_key' => $license_key,
28
                'valid_until' => $valid_until,
29
                'created_at' => current_time( 'mysql' ),
30
                'updated_at' => current_time( 'mysql' )
31
            ),
32
            array(
33
                '%d',
34
                '%s',
35
                '%s',
36
                '%s',
37
                '%s',
38
                '%s'
39
            )
40
        );
41
42
        // Redirect to the list of licenses for displaying the new license

43
        wp_redirect( admin_url( 'admin.php?page=wp-licenses' ) );
44
    }
45
}

Mari kita pergi melalui fungsi untuk melihat apa yang dilakukan:

Baris 8-10: memverifikasi kesempatan ini yang ditambahkan dalam form HTML.

Baris 14-16: mengumpulkan dan membersihkan data lisensi yang disubmit.

Baris 18: Menghasilkan kunci lisensi. Dalam plugin ini, kami memperlakukan kunci lisensi seperti password yang selalu digunakan bersama dengan alamat email pengguna, jadi saya memutuskan untuk tidak memerlukan kunci lisensi untuk menjadi unik. WordPress fungsi password generasi adalah cara sederhana untuk membuat sandi acak — mungkin tidak yang paling aman pilihan sepanjang masa, tetapi cukup baik.

Baris 21 – 40: menyimpan data untuk tabel di database kami. Parameter pertama ke fungsi insert di $wpdb adalah nama tabel. Yang kedua adalah sebuah array dengan kolom database dan nilai-nilai mereka. Ketiga menentukan jenis parameter untuk memformat query (%s berarti string dan dikutip, nilai-nilai numerik yang ditentukan dengan %d dibiarkan tanpa tanda kutip).

Baris 43: Mengarahkan ulang pengguna ke daftar lisensi. Kita akan membangun berikutnya.

4. daftar lisensi

Sekarang bahwa kita menyimpan beberapa data untuk lisensi, sudah waktunya untuk langkah terakhir dalam tutorial ini: membangun daftar untuk browsing lisensi.

Licenses page in pluginLicenses page in pluginLicenses page in plugin

Saya selalu ingin membuat tampilan UIs admin saya sebagai banyak seperti admin WordPress itu sendiri yang saya bisa, dan Jadi, ketika membuat daftar ini, saya memutuskan untuk pergi dengan kode yang sama yang menggunakan WordPress inti untuk render daftar sendiri: class Wp_List_Table , digambarkan sebagai "[b]ase class untuk menampilkan daftar item dalam tabel ajaxified HTML" dalam dokumentasi PHPDoc .

class membuatnya sangat mudah untuk membuat baik mencari daftar tabel seperti yang Anda lihat di atas di WordPress, tapi datang dengan pengecualian:

WordPress pengembang telah mendokumentasikan clas sebagai @private, berarti bahwa mereka berhak untuk mengubah secara radikal waktu yang mereka Harap. Dengan kata lain, menggunakan class adalah risiko dan berarti bahwa Anda akan memiliki untuk menguji plugin Anda dengan hati-hati sebelum setiap rilis WordPress baru untuk memastikan daftar masih bekerja.

Jika itu terdengar terlalu berisiko untuk Anda, ada pilihan lain: Salin versi saat ini dari class ke dalam proyek Anda sendiri, mengubah dan menggunakan dicopy filenya sebagai class dasar daftar Anda sendiri. Pada akhirnya, saya memutuskan untuk pergi dengan menyalin pilihan sendiri, untuk memastikan semuanya bekerja masih di masa depan.

Langkah 1: Buat List Table class

Pertama, mencari class Wp_List_Table (it's in wp-admin/includes/class-wp-list-table.php) dan menyalinnya ke proyek Anda sendiri. Pastikan untuk mengubah nama class dan file sehingga mereka tidak akan konflik dengan class asli dari WordPress core (misalnya Wp_License_Manager_List_Table).

Kemudian, membuat class dari kelas Anda sendiri untuk memperpanjang base class ini. memanggil class Licenses_List_Table dan tempatkan di direktori admin. Kemudian tambahkan baris berikut require_once ke fungsi load_dependencies di Wp_License_Manager:

1
/**

2
 * The classes responsible for rendering the list of licenses.

3
 */
4
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wp-license-manager-list-table.php';
5
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-licenses-list-table.php';

Membuka class yang baru anda buat, Licenses_List_Table, dan menambahkan konstruktor yang mengambil teks domain untuk lokalisasi sebagai parameter dan field untuk menyimpan nilai. Satu ini tidak perlu penjelasan:

1
class Licenses_List_Table extends Wp_License_Manager_List_Table {
2
3
    /**

4
    * The plugin's text domain.

5
    * 

6
    * @access  private

7
    * @var     string  The plugin's text domain. Used for localization.

8
    */
9
    private $text_domain;
10
11
    /**

12
     * Initializes the WP_List_Table implementation.

13
     *

14
     * @param $text_domain  string  The text domain used for localizing the plugin.

15
     */
16
    public function __construct( $text_domain ) {
17
        parent::__construct();
18
19
        $this->text_domain = $text_domain;
20
    }
21
    
22
}

Langkah 2: Mendefinisikan daftar kolom-kolom

Wp_List_Table dilengkapi dengan satu set fungsi yang dapat kita override untuk menentukan data dan format aturan untuk daftar.

Mari kita mulai dengan mendefinisikan kolom untuk menampilkan daftar, pesanan mereka dan header untuk setiap kolom. Tambahkan fungsi ini untuk class Licenses_List_Table.

1
/**

2
 * Defines the database columns shown in the table and a 

3
 * header for each column. The order of the columns in the 

4
 * table define the order in which they are rendered in the list table.

5
 *

6
 * @return array    The database columns and their headers for the table.

7
 */
8
public function get_columns() {
9
    return array(
10
        'license_key' => __( 'License Key', $this->text_domain ),
11
        'email'       => __( 'Email', $this->text_domain ),
12
        'product_id'  => __( 'Product', $this->text_domain ),
13
        'valid_until' => __( 'Valid Until', $this->text_domain ),
14
        'created_at'  => __( 'Created', $this->text_domain )
15
    );
16
}

Perhatikan bahwa tombol dalam array harus sesuai dengan nama-nama kolom dalam tabel database.

Jika kita tidak ingin menampilkan kolom created_at, kita dapat dengan mudah menyembunyikan menggunakan get_hidden_columns fungsi:

1
/**

2
 * Returns the names of columns that should be hidden from the list table.

3
 * 

4
 * @return array    The database columns that should not be shown in the table.

5
 */
6
public function get_hidden_columns() {
7
    return array( 'created_at' );
8
}

Mendefinisikan kolom yang dapat digunakan untuk menyortir daftar data dilakukan dengan cara yang sama:

1
/**

2
 * Returns the columns that can be used for sorting the list table data. 

3
 * 

4
 * @return array    The database columns that can be used for sorting the table.

5
 */
6
public function get_sortable_columns() {
7
    return array(
8
        'email' => array( 'email', false ),
9
        'valid_until' => array( 'valid_until', false )
10
    );
11
}

Selanjutnya, mari kita lihat memformat kolom data. Format dapat dilakukan dengan dua cara: baik dengan mendefinisikan fungsi format kustom dengan nama column_ {column_name} yang mana column_name adalah nama kolom seperti yang tercantum di get_columns di atas, atau dengan menggunakan fungsi renderer default, column_default.

Mari kita gunakan column_default untuk kolom yang akan ditampilkan. Fungsi mengambil dua parameter: baris database yang sedang ditangani ($item) dan nama kolom ($column_name).

1
/**

2
 * Default rendering for table columns.

3
 *

4
 * @param $item         array   The database row being printed out.

5
 * @param $column_name  string  The column currently processed.

6
 * @return string       The text or HTML that should be shown for the column.

7
 */
8
function column_default( $item, $column_name ) {
9
    switch( $column_name ) {
10
        case 'email':
11
        case 'created_at':
12
            return $item[$column_name];
13
14
        default:
15
            break;
16
    }
17
18
    return '';
19
}

Kemudian, mari kita ambil contoh dari fungsi kustom output. Melihat kode sumber plugin, Anda dapat melihat bahwa saya telah menciptakan sekelompok itu.

Berikut adalah contoh, renderer kolom valid_until:

1
/**

2
 * Custom renderer for the valid_until field.

3
 *

4
 * @param $item     array   The database row being printed out.

5
 * @return string   The text or HTML that should be shown for the column.

6
 */
7
function column_valid_until( $item ) {
8
    $valid_until = $item['valid_until'];
9
10
    if ($valid_until == '0000-00-00 00:00:00') {
11
        return __( 'Forever', $this->text_domain );
12
    }
13
14
    return $valid_until;
15
}

Renderer ini menampilkan "Forever" ketika nilai bidang adalah ' 0000-00-00 00:00:00 ' dan sebaliknya nilai itu sendiri. Anda mendapatkan titik.

Langkah 3: Query daftar Data

Sekarang bahwa kami telah mendefinisikan pengaturan render untuk daftar, mari kita tambahkan beberapa data ke dalam campuran. Hal ini dilakukan dalam WP_List_Table fungsi prepare_items.

Berikut adalah fungsi:

1
/**

2
 * Populates the class fields for displaying the list of licenses.

3
 */
4
public function prepare_items() {
5
    global $wpdb;
6
    $table_name = $wpdb->prefix . 'product_licenses';
7
8
    $columns = $this->get_columns();
9
    $hidden = $this->get_hidden_columns();
10
    $sortable = $this->get_sortable_columns();
11
12
    $this->_column_headers = array( $columns, $hidden, $sortable );
13
14
    // Pagination

15
    $licenses_per_page = 20;
16
    $total_items = $wpdb->get_var( "SELECT COUNT(id) FROM $table_name" );
17
18
    $offset = 0;
19
    if ( isset( $_REQUEST['paged'] ) ) {
20
        $page = max( 0, intval( $_REQUEST['paged'] ) - 1 );
21
        $offset = $page * $licenses_per_page;
22
    }
23
24
    $this->set_pagination_args(
25
        array(
26
            'total_items' => $total_items,
27
            'per_page' => $licenses_per_page,
28
            'total_pages' => ceil( $total_items / $licenses_per_page )
29
        )
30
    );
31
32
    // Sorting

33
    $order_by = 'email'; // Default sort key

34
    if ( isset( $_REQUEST['orderby'] ) ) {
35
        // If the requested sort key is a valid column, use it for sorting

36
        if ( in_array( $_REQUEST['orderby'], array_keys( $this->get_sortable_columns() ) ) ) {
37
            $order_by = $_REQUEST['orderby'];
38
        }
39
    }
40
41
    $order = 'asc'; // Default sort order

42
    if ( isset( $_REQUEST['order'] ) ) {
43
        if ( in_array( $_REQUEST['order'], array( 'asc', 'desc' ) ) ) {
44
            $order = $_REQUEST['order'];
45
        }
46
    }
47
48
    // Do the SQL query and populate items

49
    $this->items = $wpdb->get_results(
50
        $wpdb->prepare( "SELECT * FROM $table_name ORDER BY $order_by $order LIMIT %d OFFSET %d", $licenses_per_page, $offset ),
51
        ARRAY_A );
52
}

Mari kita pergi melalui fungsi untuk melihat apa yang dilakukan:

Baris 8 – 12: mengumpulkan tajuk kolom dan penyortiran informasi menggunakan fungsi-fungsi yang kami ciptakan di atas.

Setelah ini, Bagian yang tersisa adalah tentang query data.

Baris 15 – 22: menghitung pagination informasi. Jika pengguna telah meminta halaman, parameter paged berisi nomor halaman (mulai dari 1), sehingga kita dapat menggunakannya untuk menghitung offset untuk SQL query.

Baris 24 – 30: menyampaikan informasi pagination untuk daftar tabel sehingga ia dapat menampilkan tombol navigasi yang benar ketika rendering tabel.

Baris 33 – 46: mempersiapkan jenis kolom dan urutan berdasarkan input pengguna.

Baris 49-51: menggunakan variabel yang ditetapkan di awal fungsi untuk melakukan database query dan mengisi variabel class $items.

Dan hanya itu: Anda sekarang membuat tabel paged dan sortable untuk menampilkan lisensi.

Langkah 4: Gunakan daftar tabel

Sebelumnya dalam tutorial ini, kami menciptakan sebuah fungsi yang kosong untuk menampilkan isi dari halaman Licenses. Sekarang bahwa kita telah menciptakan daftar tabel, kita dapat mengisi yang berfungsi (render_licenses_menu_list di Wp_License_Manager_Admin) dan akhirnya membuat lisensi terlihat:

1
/**

2
 * Renders the list of licenses menu page using the "licenses_list.php" partial.

3
 */
4
public function render_licenses_menu_list() {
5
    $list_table = new Licenses_List_Table( $this->plugin_name );
6
    $list_table->prepare_items();
7
8
    require plugin_dir_path( dirname( __FILE__ ) ) . 'admin/partials/licenses_list.php';
9
}

Fungsi pertama membuat instance class kami, Licenses_List_Table, kemudian memanggil dengan fungsi prepare_items (didefinisikan di atas) untuk menginisialisasi data, dan akhirnya memasukan template HTML untuk merender halaman.

Template ini juga mengandung sebuah panggilan ke $list_table-> display(), yang membuat daftar pada halaman:

1
<?php
2
/**

3
 * The view for the admin page used for listing licenses.

4
 *

5
 * @package    Wp_License_Manager

6
 * @subpackage Wp_License_Manager/admin/partials

7
 */
8
?>
9
10
<div class="wrap">
11
    <h2>
12
        <?php _e( 'Licenses', $this->plugin_name ); ?>
13
        <a class="add-new-h2" href="<?php echo admin_url( 'admin.php?page=wp-licenses-new' );?>">
14
            <?php _e( 'Add new', $this->plugin_name ) ?>
15
        </a>
16
    </h2>
17
18
    <?php $list_table->display(); ?>
19
</div>

Apa berikutnya?

Kami sekarang telah menciptakan sebuah plugin dasar untuk menyimpan produk dan lisensi. Ini bukan akhir, namun.

Dalam bagian kedua dari seri tutorial, kami akan terus bekerja pada plugin dan memperpanjang dengan API yang plugin dan tema dapat digunakan untuk memeriksa pengguna lisensi dan men-download pembaruan.

Ketemu lain kali!

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.