Maison >développement back-end >tutoriel php >Création d'options de plugin WordPress basées sur une structure JSON

Création d'options de plugin WordPress basées sur une structure JSON

Barbara Streisand
Barbara Streisandoriginal
2024-12-11 15:48:11406parcourir

L'autre jour, je me demandais comment laisser les options du plugin WordPress être contrôlées par un fichier JSON, permettant ainsi d'ajouter plus facilement des paramètres supplémentaires à l'avenir sans avoir à ajuster le code lui-même.

Cet article fournit un exemple de plugin WordPress extrêmement simple avec une seule page de paramètres composée de 2 sections et 3 champs/options.

Le code complet peut être trouvé sur Github.

Mise en place du socle

Le plugin est initialement composé de 3 fichiers.

  • aventures.json
  • aventures.php
  • class.adventures.php

adventures.php avec une inscription de base au plugin :

<?php
/*
Plugin Name: Adventures
Plugin URI: https://mortenhartvig.dk
Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pharetra nisi eu varius pellentesque. Aenean posuere, velit mollis sodales convallis, ipsum lectus feugiat nunc, ac auctor sapien enim eu metus.
Version: 1
Requires at least: 6.1
Requires PHP: 8.3
Author: Morten Hartvig
Author URI: https://mortenhartvig.dk
License: Do whatever you want
*/

define('ADV__PLUGIN_DIR', plugin_dir_path(__FILE__));
define('ADV__PLUGIN_VIEW', ADV__PLUGIN_DIR . 'views');
define('ADV__PLUGIN_SLUG', 'adv');

require_once ADV__PLUGIN_DIR . 'class.adventures.php';

(new Adventures());

class.adventures.php avec une classe vide :

<?php

class Adventures {
    public function __construct() {

    }
}

adventures.json contient la structure JSON des paramètres du plugin :

{
    "settings": {
        "pages": [
            {
                "title": "Adventures",
                "capability": "manage_options",
                "slug": "adv"
            }
        ],
        "sections": [
            {
                "id": "portal_base",
                "title": "Base configuration",
                "description": "Lorem 1, ipsum dolor sit amet consectetur adipisicing elit. Cumque nulla in officiis. Laborum quisquam illo eaque, deserunt facere mollitia sint doloremque maiores, obcaecati reiciendis voluptate itaque iure fugiat quia architecto!",
                "view": "section"
            },
            {
                "id": "portal_appearance",
                "title": "Appearance",
                "description": "Lorem 2, ipsum dolor sit amet consectetur adipisicing elit. Cumque nulla in officiis. Laborum quisquam illo eaque, deserunt facere mollitia sint doloremque maiores, obcaecati reiciendis voluptate itaque iure fugiat quia architecto!",
                "view": "section"
            }
        ],
        "fields": [
            {
                "id": "adv_portal_key",
                "title": "Portal Key",
                "section": "portal_base",
                "type": "text",
                "placeholder": "Enter your portal key",
                "view": "field.text"
            },
            {
                "id": "adv_api_host",
                "title": "Host API",
                "section": "portal_base",
                "type": "text",
                "placeholder": "Enter API host",
                "default": "https://api.mortenhartvig.dk",
                "view": "field.text"
            },
            {
                "id": "adv_portal_theme",
                "title": "Theme",
                "section": "portal_appearance",
                "type": "select",
                "options": {
                    "rounded.v1": "Round (V1)",
                    "squared.v1": "Square (V1)",
                    "standard": "Standard"
                },
                "default": "standard",
                "view": "field.select"
            }
        ]
    }
}

Lecture des données JSON

Créez une propriété pour vos paramètres et appelez set_settings() :

private $settings;

public function __construct() {
    $this->set_settings();
}

Créez set_settings() et get_json_data() :

private function set_settings() {
    $data = $this->get_json_data();

    $this->settings = $data['settings'];
}

private function get_json_data() {
    $file = ADV__PLUGIN_DIR . 'adventures.json';

    if (!file_exists($file)) {
        die('adventures.json not found');
    }

    return json_decode(file_get_contents($file), true);
}

Si vous ajoutez un die(print_r($this->settings)) à votre __construct, vous pouvez confirmer que vos paramètres sont effectivement chargés.

Creating WordPress plugin options based on a JSON structure

Page des paramètres

Appelez init_hooks() depuis le constructeur :

public function __construct() {
    $this->set_settings();
    $this->init_hooks();
}

Créer init_hooks() :

private function init_hooks() {
    add_action('admin_menu', [$this, 'register_settings_pages']);
}

Créez register_settings_pages() et settings_page_callback().

public function register_settings_pages() {
    foreach ($this->settings['pages'] as $page) {
        add_options_page($page['title'], $page['title'], $page['capability'], $page['slug'], [$this, 'settings_page_callback']);    
    }
}

public function settings_page_callback() {
    $this->render('settings.php');
}

Créer un rendu() :

private function render($filename, $args) {
    if (is_array($args)) {
        $value = get_option($args['id']);

        if (empty($value) && isset($args['default'])) {
            $value = $args['default'];
        }

        $args = array_merge($args, ['value' => $value]);
    }

    $file = ADV__PLUGIN_VIEW . $filename;

    if (!str_ends_with($file,'.php')) {
        $file .= '.php';
    }

    if(!file_exists($file)) {
        die('File not found ' . $filename);
    }

    require $file;
}

Créer des vues/settings.php :

<div>



<p><img src="https://img.php.cn/upload/article/000/000/000/173390329693560.jpg" alt="Creating WordPress plugin options based on a JSON structure" /></p>

<h3>
  
  
  Sections
</h3>

<p>Add another action in init_hooks:<br>
</p>

<pre class="brush:php;toolbar:false">private function init_hooks() {
    add_action('admin_menu', [$this, 'register_settings_pages']);
    add_action('admin_init', [$this, 'register_settings_sections']);
}

Créez register_settings_sections() et settings_section_callback() :

public function register_settings_sections() {
    foreach ($this->settings['sections'] as $section) {
        add_settings_section($section['id'], $section['title'], [$this, 'settings_section_callback'], ADV__PLUGIN_SLUG, $section);
    }
}

public function settings_section_callback($args) {
    $this->render($args['view'], $args);
}

Créer des vues/section.php :

<p>
    <?php echo $args['description']; ?>
</p>

Champs

Ajouter une troisième action dans init_hooks :

private function init_hooks() {
    add_action('admin_menu', [$this, 'register_settings_pages']);
    add_action('admin_init', [$this, 'register_settings_sections']);
    add_action('admin_init', [$this, 'register_settings_fields']);
}

Créez register_settings_fields() et settings_field_callback() :

public function register_settings_fields() {
    foreach ($this->settings['fields'] as $field) {
        add_settings_field($field['id'], $field['title'], [$this, 'settings_field_callback'], ADV__PLUGIN_SLUG, $field['section'], $field);

        register_setting(ADV__PLUGIN_SLUG, $field['id']);
    }
}

public function settings_field_callback($args) {
    $this->render($args['view'], $args);
}

Créer des vues/field.select.php :

<?php

$html_options = '';

foreach ($args['options'] as $key => $val) {
    $html_options .= sprintf('<option value="%s" %s >%s</option>', $key, selected($args['value'], $key, false), $val);
}

printf('<select name="%s">



<p>Create views/field.text.php:<br>
</p>

<pre class="brush:php;toolbar:false"><?php

printf('<input name="%s">



<h3>
  
  
  Saving
</h3>

<p>To view and save your options add a form to settings.php:<br>
</p>

<pre class="brush:php;toolbar:false"><div>



<p>Change an option and attempt to <em>Save</em>. The save should be successful.</p>

<p><img src="https://img.php.cn/upload/article/000/000/000/173390329893991.jpg" alt="Creating WordPress plugin options based on a JSON structure"></p>

<p>Your settings are now saved and can be accessed throughout the site via:<br>
</p>

<pre class="brush:php;toolbar:false"><?php
echo get_option('adv_portal_theme'); // squared.v1

Ajout de nouveaux champs

Ajoutez le JSON ci-dessous à aventures.json :

{
    "id": "adv_api_token",
    "title": "Host API Token",
    "section": "portal_base",
    "type": "text",
    "placeholder": "Enter API host token",
    "default": "",
    "view": "field.text"
}

Il sera automatiquement ajouté à vos paramètres :

Creating WordPress plugin options based on a JSON structure

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn