Після всього попереднього вмісту ми нарешті досягли того місця, де ми готові розпочати вирішення стандартних проблем кодування, створених нашою IDE та нашими інструментами якості коду.
Роблячи це, я збираюся розбити вміст на дві публікації:
- перша публікація буде зосереджена виключно на рефакторингу існуючого коду,
- у наступній публікації ми розглянемо рефакторинг структури плагіна для покращення організації та архітектури.
А поки що давайте поглянемо на помилки, які видає аналізатор коду, і подивимося, чи не зможемо ми привести його до більш сучасних стандартів.
Шаблон віджета WordPress: рефакторинг, частина 2
Зауважте, що я все ще перебуваю на гілці розробки, оскільки ми ще не готові об’єднати це в master. І якщо у вас належним чином налаштовано сніфери коду та інші інструменти, ви повинні побачити наступне:
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
І ви повинні побачити принаймні все це після запуску:
$ vendor/bin/grumphp run
Перш ніж рухатися далі, нам потрібно внести деякі незначні зміни в організацію файлів. Тобто нам потрібно розділити основний файл плагіна (який ми маємо як Plugin.php) на два файли.
Зокрема, нам потрібно мати файл завантаження плагіна, а потім нам потрібно підтримувати основний файл плагіна. Отже, спочатку давайте створимо завантажувальну програму плагіна.
Створіть Bootstrap
У корені плагіна створіть файл під назвою wordpress-widget-boilerplate.php. Потім додайте до нього наступне :
<?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';
Примітка у файлі вище; у нас є заголовок плагіна, умова, щоб визначити, чи можна отримати доступ до файлу, а потім завантажується автозавантажувач Composer.
Відредагуйте основний плагін
Коли це буде зроблено, основний файл Plugin.php буде виглядати так:
<?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') );
Пам’ятайте, що нам ще потрібно зробити багато роботи, але перше, що нам потрібно зробити, це почати очищати кодову базу від її поточного стану. Згодом ми переробимо це в більш об’єктно-орієнтований спосіб, але нам потрібно отримати поточну версію плагіна в справному стані.
Однак тепер ми можемо знову звернути увагу на вихідний результат GrumPHP. Якщо ви подивитеся, ви побачите такий рядок:
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'
Отже, на цьому етапі давайте розглянемо виконання рекомендованої команди та побачимо, що станеться. Зокрема, введіть це у свій термінал:
'/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'
Якщо припустити, що все працює правильно, ви повинні побачити щось на зразок цього:
Примітка щодо помилок виводу
Якщо ви отримуєте будь-яку помилку, коли ви робите це, можливо, вам потрібно оновити каталог постачальника або навіть оновити каталог. Якщо це так, то спочатку спробуйте це:
$ composer update
І якщо це не вирішить вашу проблему, спробуйте:
$ rm -rf vendor
$ composer update
Після цього повторно запустіть команду.
Назад до виводу
Потім ви повинні побачити такі результати:
Далі виконайте таку команду на вашому терміналі:
$ vendor/grumphp/run
Тут ви повинні побачити проблеми зі стандартами кодування. Список занадто довгий, щоб перераховувати тут, але ви повинні побачити опцію, щоб зробити щось подібне:
----------------------------------------------------------------------
FOUND 9 ERRORS AFFECTING 8 LINES
----------------------------------------------------------------------
І на даний момент нам потрібно внести багато змін, якщо ми хочемо привести його до стандартів PSR2. Тож давайте зробимо це зараз.
Рефакторинг шаблону віджетів
Якщо припустити, що у Visual Studio Code встановлено всі необхідні розширення та плагіни, ви, ймовірно, побачите достатню кількість червоного у своїй IDE.
Це все проблеми, які потрібно вирішувати. Тож я збираюся пройти й оновити код. Тоді я поділюся кодом тут (без коментарів заради економії місця).
Припускаючи, що ви внесли всі належні зміни, у вас повинно вийти щось на зразок цього:
<?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']);
}
}
Ще раз запустіть:
$ vendor/bin/grumphp run
І подивіться, який результат ви отримаєте. Ви все ще отримуватимете різноманітні помилки, а саме такі, що говорять щось схоже на:
Уникайте невикористаних локальних змінних, таких як…
Це тому, що правила перевірки коду не хочуть, щоб ми використовували змінні, які не використовуються; однак у шаблоні ми, швидше за все, будемо використовувати ці змінні до кінця проекту.
Отже, наразі про це не потрібно турбуватися. Ми впораємось, коли прийде час.
До PSR
На даний момент більша частина плагіна була придбана відповідно до стандартів PSR і має надійний набір інструментів, які ми можемо використовувати для постійного тестування нашого коду під час його написання.
Якщо ви слідкуєте за репозиторієм, гілку розробки було оновлено, щоб відобразити зміни в цій публікації, тому не соромтеся витягувати її та переглядати код.
У наступній публікації ми почнемо рефакторинг коду набагато більш об’єктно-орієнтованим способом.

