Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Widgets WordPress : refactorisation, partie 2

15

Après tout le contenu préliminaire, nous sommes enfin à un endroit où nous sommes prêts à commencer à résoudre les problèmes standard de codage posés par notre IDE et par nos outils de qualité de code.

Ce faisant, je vais décomposer le contenu en deux articles :

  • le premier article va se concentrer uniquement sur la refactorisation du code existant,
  • dans le prochain article, nous allons examiner la refactorisation de la structure du plugin pour améliorer l’organisation et l’architecture.

Pour l’instant, examinons les erreurs générées par le renifleur de code et voyons si nous ne pouvons pas l’adapter à des normes plus modernes.

Le passe-partout du widget WordPress: refactorisation, partie 2

Notez que je suis toujours sur la branche develop car nous ne sommes pas encore prêts à fusionner cela dans master. Et si vos renifleurs de code et autres outils sont correctement configurés, vous devriez voir ce qui suit :

Warning: Uncaught ErrorException: require_once(/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/vendor/autoload.php): failed to open stream: No such file or directory in /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer:62
Stack trace:
#0 /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer(62): {closure}(2, 'require_once(/U...', '/Users/tommcfar...', 62, Array)
#1 /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer(62): require_once()
#2 {main}
  thrown in /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer on line 62

Call Stack:
    0.0041     365448   1. {main}() /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer:0

Fatal error: main(): Failed opening required '/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/vendor/autoload.php' (include_path='.:/usr/local/Cellar/php@7.1/7.1.19/share/php@7.1/pear') in /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer on line 62

Call Stack:
    0.0041     365448   1. {main}() /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer:0

You can fix all errors by running following commands:
'/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer' '--allow-risky=yes' '--config=.php_cs.dist' '--using-cache=yes' '--verbose' 'fix'
ERROR: Ruleset /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/phpcs.xml is not valid

Run "phpcs --help" for usage information

Warning: require(/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint.php): failed to open stream: No such file or directory in /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint on line 4

Call Stack:
    0.0035     352864   1. {main}() /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint:0

Fatal error: require(): Failed opening required '/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint.php' (include_path='.:/usr/local/Cellar/php@7.1/7.1.19/share/php@7.1/pear') in /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint on line 4

Call Stack:
    0.0035     352864   1. {main}() /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint:0

PHP Warning:  require(/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint.php): failed to open stream: No such file or directory in /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint on line 4
PHP Stack trace:
PHP   1. {main}() /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint:0
PHP Fatal error:  require(): Failed opening required '/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint.php' (include_path='.:/usr/local/Cellar/php@7.1/7.1.19/share/php@7.1/pear') in /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint on line 4
PHP Stack trace:
PHP   1. {main}() /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/parallel-lint:0
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:33     The class Widget_Name has 12 public methods. Consider refactoring Widget_Name to keep number of public methods under 10.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:33     The class Widget_Name is not named in CamelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:33     The property$widget_slug is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:97     The method get_widget_slug is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:111    The variable$widget_string is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:111    The variable$before_widget is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:111    The variable$widget_string is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:111    The variable$widget_string is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:111    The variable$after_widget is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:111    The variable$widget_string is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:111    The variable$widget_string is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:111    Avoid unusedparameters such as '$instance'.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:131    Avoid unusedlocal variables such as '$before_widget'.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:137    Avoid unusedlocal variables such as '$after_widget'.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:149    The method flush_widget_cache is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:159    The parameter $new_instance is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:159    The parameter $old_instance is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:159    The variable$old_instance is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:159    Avoid unusedparameters such as '$new_instance'.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:195    The method widget_textdomain is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:207    The parameter $network_wide is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:207    Avoid unusedparameters such as '$network_wide'.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:216    The parameter $network_wide is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:216    Avoid unusedparameters such as '$network_wide'.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:223    The method register_admin_styles is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:232    The method register_admin_scripts is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:241    The method register_widget_styles is not named in camelCase.
/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/src/Plugin.php:250    The method register_widget_scripts is not named in camelCase.
[FATAL] /Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/phpcs.xml: Premature end of data in tag ruleset line 2
 (77) on line 28,12

Et vous devriez voir au moins tout cela après avoir exécuté :

$ vendor/bin/grumphp run

Avant d’aller de l’avant, nous devons apporter quelques modifications mineures à l’organisation des fichiers. C’est-à-dire que nous devons séparer le fichier principal du plugin (que nous avons sous le nom de Plugin.php) en deux fichiers.

Plus précisément, nous avons besoin d’un fichier d’amorçage de plug-in, puis nous devons maintenir le fichier de plug-in principal. Donc, d’abord, créons un plugin bootstrap.

Créer le bootstrap

A la racine du plugin, créez un fichier nommé wordpress-widget-boilerplate.php. Ajoutez-y ensuite ce qui suit :

<?php
/**
 * WordPress Widget Boilerplate
 *
 * The WordPress Widget Boilerplate is an organized, maintainable boilerplate for building widgets using WordPress best practices.
 *
 * @package   Widget_Name
 * @author    Your Name <email@example.com>
 * @license   GPL-2.0+
 * @link      http://example.com
 * @copyright 2018 Your Name or Company Name
 *
 * @wordpress-plugin
 * Plugin Name:       @TODO
 * Plugin URI:        @TODO
 * Description:       @TODO
 * Version:           1.0.0
 * Author:            @TODO
 * Author URI:        @TODO
 * Text Domain:       widget-name
 * License:           GPL-3.0+
 * License URI:       http://www.gnu.org/licenses/gpl-3.0.txt
 * Domain Path:       /lang
 * GitHub Plugin URI: https://github.com/<owner>/<repo>
 */

// Prevent this file from being called directly.
defined('WPINC') || die;

// Include the autoloader.
require_once __DIR__. '/inc/autoload.php';

Notez dans le fichier ci-dessus; nous avons l’en-tête du plug-in, la condition pour déterminer si le fichier est accessible, puis le chargement du chargeur automatique Composer.

Modifier le plugin principal

Une fois cela fait, cela changera le fichier principal Plugin.php pour qu’il ressemble à ceci :

<?php

// TODO: change 'Widget_Name' to the name of your plugin
class Widget_Name extends WP_Widget {

    /**
     * @TODO - Rename "widget-name" to the name your your widget
     *
     * Unique identifier for your widget.
     *
     *
     * The variable name is used as the text domain when internationalizing strings
     * of text. Its value should match the Text Domain file header in the main
     * widget file.
     *
     * @since    1.0.0
     *
     * @var      string
     */
    protected $widget_slug = 'widget-name';

    /*--------------------------------------------------*/
    /* Constructor
    /*--------------------------------------------------*/

    /**
     * Specifies the classname and description, instantiates the widget,
     * loads localization files, and includes necessary stylesheets and JavaScript.
     */
    public function __construct() {

        // load plugin text domain
        add_action( 'init', array( $this, 'widget_textdomain') );

        // TODO: update description
        parent::__construct(
            $this->get_widget_slug(),
            __( 'Widget Name', $this->get_widget_slug() ),
            array(
                'classname'  => $this->get_widget_slug().'-class',
                'description' => __( 'Short description of the widget goes here.', $this->get_widget_slug())) );

        // Register admin styles and scripts
        add_action( 'admin_print_styles', array( $this, 'register_admin_styles') );
        add_action( 'admin_enqueue_scripts', array( $this, 'register_admin_scripts') );

        // Register site styles and scripts
        add_action( 'wp_enqueue_scripts', array( $this, 'register_widget_styles') );
        add_action( 'wp_enqueue_scripts', array( $this, 'register_widget_scripts') );

        // Refreshing the widget's cached output with each new post
        add_action( 'save_post',    array( $this, 'flush_widget_cache') );
        add_action( 'deleted_post', array( $this, 'flush_widget_cache') );
        add_action( 'switch_theme', array( $this, 'flush_widget_cache') );

    } // end constructor

    /**
     * Return the widget slug.
     *
     * @since    1.0.0
     *
     * @return    Plugin slug variable.
     */
    public function get_widget_slug() {
        return $this->widget_slug;
    }

    /*--------------------------------------------------*/
    /* Widget API Functions
    /*--------------------------------------------------*/

    /**
     * Outputs the content of the widget.
     *
     * @param array args  The array of form elements
     * @param array instance The current instance of the widget
     */
    public function widget( $args, $instance) {

        // Check if there is a cached output
        $cache = wp_cache_get( $this->get_widget_slug(), 'widget' );

        if (!is_array( $cache)) $cache = array();

        if (! isset ($args['widget_id'])) $args['widget_id'] = $this->id;

        if (isset ($cache[ $args['widget_id'] ])) return print $cache[ $args['widget_id'] ];

        // go on with your widget logic, put everything into a string and …

        extract( $args, EXTR_SKIP );

        $widget_string = $before_widget;

        // TODO: Here is where you manipulate your widget's values based on their input fields
        ob_start();
        include( plugin_dir_path( __FILE__ ). 'views/widget.php' );
        $widget_string .= ob_get_clean();
        $widget_string .= $after_widget;

        $cache[ $args['widget_id'] ] = $widget_string;

        wp_cache_set( $this->get_widget_slug(), $cache, 'widget' );

        print $widget_string;

    } // end widget

    public function flush_widget_cache()
    {
        wp_cache_delete( $this->get_widget_slug(), 'widget' );
    }
    /**
     * Processes the widget's options to be saved.
     *
     * @param array new_instance The new instance of values to be generated via the update.
     * @param array old_instance The previous instance of values before the update.
     */
    public function update( $new_instance, $old_instance) {

        $instance = $old_instance;

        // TODO: Here is where you update your widget's old values with the new, incoming values

        return $instance;

    } // end update

    /**
     * Generates the administration form for the widget.
     *
     * @param array instance The array of keys and values for the widget.
     */
    public function form( $instance) {

        // TODO: Define default values for your variables
        $instance = wp_parse_args(
            (array) $instance
        );

        // TODO: Store the values of the widget in their own variable

        // Display the admin form
        include( plugin_dir_path(__FILE__). 'views/admin.php' );

    } // end form

    /*--------------------------------------------------*/
    /* Public Functions
    /*--------------------------------------------------*/

    /**
     * Loads the Widget's text domain for localization and translation.
     */
    public function widget_textdomain() {

        // TODO be sure to change 'widget-name' to the name of *your* plugin
        load_plugin_textdomain( $this->get_widget_slug(), false, dirname( plugin_basename( __FILE__) ). 'lang/' );

    } // end widget_textdomain

    /**
     * Fired when the plugin is activated.
     *
     * @param  boolean $network_wide True if WPMU superadmin uses "Network Activate" action, false if WPMU is disabled or plugin is activated on an individual blog.
     */
    public static function activate( $network_wide) {
        // TODO define activation functionality here
    } // end activate

    /**
     * Fired when the plugin is deactivated.
     *
     * @param boolean $network_wide True if WPMU superadmin uses "Network Activate" action, false if WPMU is disabled or plugin is activated on an individual blog
     */
    public static function deactivate( $network_wide) {
        // TODO define deactivation functionality here
    } // end deactivate

    /**
     * Registers and enqueues admin-specific styles.
     */
    public function register_admin_styles() {

        wp_enqueue_style( $this->get_widget_slug().'-admin-styles', plugins_url( 'css/admin.css', __FILE__) );

    } // end register_admin_styles

    /**
     * Registers and enqueues admin-specific JavaScript.
     */
    public function register_admin_scripts() {

        wp_enqueue_script( $this->get_widget_slug().'-admin-script', plugins_url( 'js/admin.js', __FILE__ ), array('jquery') );

    } // end register_admin_scripts

    /**
     * Registers and enqueues widget-specific styles.
     */
    public function register_widget_styles() {

        wp_enqueue_style( $this->get_widget_slug().'-widget-styles', plugins_url( 'css/widget.css', __FILE__) );

    } // end register_widget_styles

    /**
     * Registers and enqueues widget-specific scripts.
     */
    public function register_widget_scripts() {

        wp_enqueue_script( $this->get_widget_slug().'-script', plugins_url( 'js/widget.js', __FILE__ ), array('jquery') );

    } // end register_widget_scripts

} // end class

// TODO: Remember to change 'Widget_Name' to match the class name definition
add_action( 'widgets_init', create_function( '', 'register_widget("Widget_Name");') );

// Hooks fired when the Widget is activated and deactivated
// TODO: Remember to change 'Widget_Name' to match the class name definition
register_activation_hook( __FILE__, array( 'Widget_Name', 'activate') );
register_deactivation_hook( __FILE__, array( 'Widget_Name', 'deactivate') );

N’oubliez pas qu’il reste encore beaucoup de travail à faire, mais la première chose à faire est de commencer à nettoyer la base de code de son état actuel. Finalement, nous allons refactoriser cela d’une manière beaucoup plus orientée objet, mais nous devons obtenir la version actuelle du plugin dans un état sain.

Maintenant, cependant, nous pouvons retourner notre attention sur la sortie originale de GrumPHP. Si vous regardez à travers, la sortie, vous verrez une ligne comme celle-ci :

You can fix all errors by running following commands:
'/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer' '--allow-risky=yes' '--config=.php_cs.dist' '--using-cache=yes' '--verbose' 'fix'

Donc, à ce stade, examinons l’exécution de la commande recommandée et voyons ce qui se passe. Plus précisément, entrez ceci dans votre terminal :

'/Users/tommcfarlin/Dropbox/Projects/trunk/wp-content/plugins/WordPress-Widget-Boilerplate/vendor/bin/php-cs-fixer' '--allow-risky=yes' '--config=.php_cs.dist' '--using-cache=yes' '--verbose' 'fix'

En supposant que tout fonctionne correctement, vous devriez voir quelque chose comme ceci :

Remarque sur les erreurs de sortie

Si vous recevez une erreur chaque fois que vous faites cela, vous devrez peut-être mettre à jour le répertoire des fournisseurs ou même mettre à jour le répertoire. Si tel est le cas, essayez d’abord ceci :

$ composer update

Et si cela ne résout pas votre problème, essayez :

$ rm -rf vendor
$ composer update

Après cela, relancez la commande.

Retour à la sortie

Vous devriez alors voir une sortie comme celle-ci :

Widgets WordPress : refactorisation, partie 2

Ensuite, exécutez la commande suivante sur votre terminal :

$ vendor/grumphp/run

Ici, vous devriez maintenant voir des problèmes avec les normes de codage. La liste est trop longue pour être listée ici mais vous devriez voir une option pour faire quelque chose comme ceci :

----------------------------------------------------------------------
FOUND 9 ERRORS AFFECTING 8 LINES
----------------------------------------------------------------------

Et à ce stade, il y a beaucoup de changements que nous devons apporter si nous voulons le mettre aux normes PSR2. Alors faisons-le maintenant.

Refactoriser le Widget Boilerplate

En supposant que toutes les extensions et plug-ins nécessaires soient installés dans Visual Studio Code, vous verrez probablement une bonne quantité de rouge dans votre IDE.

Widgets WordPress : refactorisation, partie 2

Ce sont tous des problèmes qui doivent être résolus. Je vais donc parcourir et mettre à jour le code. Ensuite, je partagerai le code ici (sans commentaires pour économiser de l’espace).

En supposant que vous avez effectué toutes les modifications appropriées, vous devriez avoir quelque chose comme ceci :

<?php

namespace WordPressWidgetBoilerplate;

class Plugin extends WP_Widget
{
    protected $widgetSlug = 'widget-name';

    public function __construct()
    {
        add_action('init', [$this, 'widgetTextdomain']);

        parent::__construct(
            $this->getWidgetSlug(),
            __('Widget Name', $this->getWidgetSlug()),
            [
                'classname' => $this->getWidgetSlug().'-class',
                'description' => __('Short description of the widget goes here.', $this->getWidgetSlug()),
            ]
        );

        add_action('admin_print_styles', [$this, 'registerAdminStyles']);
        add_action('admin_enqueue_scripts', [$this, 'registerAdminScripts']);

        add_action('wp_enqueue_scripts', [$this, 'registerWidgetStyles']);
        add_action('wp_enqueue_scripts', [$this, 'registerWidgetScripts']);

        add_action('save_post', [$this, 'flushWidgetCache']);
        add_action('deleted_post', [$this, 'flushWidgetCache']);
        add_action('switch_theme', [$this, 'flushWidgetCache']);
    }

    public function getWidgetSlug()
    {
        return $this->widgetSlug;
    }

    public function widget($args, $instance)
    {
        // Check if there is a cached output
        $cache = wp_cache_get($this->getWidgetSlug(), 'widget');

        if (!is_array($cache)) {
            $cache = [];
        }

        if (!isset($args['widget_id'])) {
            $args['widget_id'] = $this->id;
        }

        if (isset($cache[$args['widget_id']])) {
            return print $cache[$args['widget_id']];
        }

        extract($args, EXTR_SKIP);

        $widgetString = $beforeWidget;

        ob_start();
        include plugin_dir_path(__FILE__).'views/widget.php';
        $widgetString .= ob_get_clean();
        $widgetString .= $afterWidget;

        $cache[$args['widget_id']] = $widgetString;

        wp_cache_set($this->getWidgetSlug(), $cache, 'widget');

        echo $widgetString;
    }

    public function flushWidgetCache()
    {
        wp_cache_delete($this->getWidgetSlug(), 'widget');
    }

    public function update($newInstance, $oldInstance)
    {
        $instance = $oldInstance;

        // TODO: Here is where you update your widget's old values with the new, incoming values

        return $instance;
    }

    public function form($instance)
    {
        // TODO: Define default values for your variables
        $instance = wp_parse_args(
            (array) $instance
        );

        // TODO: Store the values of the widget in their own variable

        // Display the admin form
        include plugin_dir_path(__FILE__).'views/admin.php';
    }

    public function widgetTextdomain()
    {
        // TODO: be sure to change 'widget-name' to the name of *your* plugin
        load_plugin_textdomain($this->getWidgetSlug(), false, dirname(plugin_basename(__FILE__)).'lang/');
    }

    public static function activate($networkWide)
    {
        // TODO: define activation functionality here
    }

    public static function deactivate($networkWide)
    {
        // TODO:define deactivation functionality here
    }

    public function registerAdminStyles()
    {
        wp_enqueue_style($this->getWidgetSlug().'-admin-styles', plugins_url('css/admin.css', __FILE__));
    }

    public function registerAdminScripts()
    {
        wp_enqueue_script($this->getWidgetSlug().'-admin-script', plugins_url('js/admin.js', __FILE__), ['jquery']);
    }

    public function registerWidgetStyles()
    {
        wp_enqueue_style($this->getWidgetSlug().'-widget-styles', plugins_url('css/widget.css', __FILE__));
    }

    public function registerWidgetScripts()
    {
        wp_enqueue_script($this->getWidgetSlug().'-script', plugins_url('js/widget.js', __FILE__), ['jquery']);
    }
}

Encore une fois, lancez :

$ vendor/bin/grumphp run

Et voyez quelle sortie vous obtenez. Vous obtiendrez toujours une variété d’erreurs, à savoir qui disent quelque chose sur le ton de :

Évitez les variables locales inutilisées telles que …

C’est parce que les règles de reniflage de code ne veulent pas que nous utilisions des variables qui ne sont pas utilisées ; cependant, dans un passe-partout, nous allons probablement utiliser ces variables avant la fin du projet.

Donc, à cette fin, il n’y a pas besoin de s’inquiéter à ce stade. On s’en occupera le moment venu.

Jusqu’au PSR

À ce stade, une grande partie du plug-in a été achetée conformément aux normes PSR et dispose d’un ensemble solide d’outils que nous pouvons utiliser pour tester systématiquement notre code tout en l’écrivant.

Si vous suivez le référentiel, la branche de développement a été mise à jour pour refléter les modifications apportées à cet article, alors n’hésitez pas à l’extraire et à revoir le code.

Dans le prochain article, nous commencerons à refactoriser le code d’une manière beaucoup plus orientée objet.

Source d’enregistrement: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More