наран/билдплатформа

Билдплатформа кода Naran для плагинов/тем WordPress.

1.6.1 2022-10-09 06:28 UTC

README

Билдплатформа кода для разработки плагинов WordPress. Включает в себя общие опыт, накопленный при разработке множества плагинов, чтобы предоставить основную структуру плагина.

Начало

Проверка требований

  • WordPress 5.x и выше. Предпочтительно использовать последнюю версию.
  • PHP 7.4 и выше.

Установка

Установка может быть выполнена с помощью composer. Ниже приведен пример создания директории 'boilerplate' в 'wp-content/plugin' и установки шаблонного кода.

composer create-project --no-dev naran/boilerplate 

Если вы хотите создать директорию с другим именем, добавьте аргумент.

composer create-project --no-dev naran/boilerplate my-plugin 

Если установка прошла успешно, composer запросит ввод пользователя для применения новых префиксов.

Please enter your new prefix (Enter 'exit' to skip): 

Введите подходящий префикс. Если вы введете 'foo' в качестве префикса, вы получите проверку, как показано ниже. Нажмите 'y', чтобы выполнить изменения префиксов в именах файлов и коде.

Replace prefix from `npbc` to `foo`. Are you sure? [Y/n]

Префиксы должны соответствовать следующим правилам.

  1. При вводе можно использовать только строчные и прописные буквы, цифры, дефис (-) и подчеркивание (_).
  2. Первый символ префикса может быть только строчной или прописной буквой.
  3. Дефис или подчеркивание не могут использоваться дважды подряд.
  4. Префикс не может заканчиваться дефисом или подчеркиванием.
  5. Новый префикс не может содержать слово 'nbpc' или 'cpbn'.
  6. Максимальная длина префикса составляет 25 символов.

Префикс используется при замене кода или имен файлов следующим образом.

  1. Имена классов и констант состоят из прописных и строчных букв и подчеркиваний. Дефис заменяется подчеркиванием. (например: ABC_DEF)
  2. Имена функций и обычных строк состоят из строчных и прописных букв и подчеркиваний. Дефис заменяется подчеркиванием. (например: abc_def)
  3. Для правильной замены префикса в строках, заключенных в одинарные или двойные кавычки, используйте строчные и прописные буквы и дефисы. Подчеркивание заменяется дефисом. (например 'abc-def')

В будущем для выполнения можно запустить скрипт wp-content/plugin/boilerplate/bin/prefix-change.php через CLI.

$ cd boilerplate
$ php bin/prefix-change.php myplugin                     # 접두 npbc를 myplugin 으로 변경.
$ php bin/prefix-change.php my-new-prefix myplugin       # 접두 myplugin를 my-new-prefix 으로 변경.

Подробнее см. php bin/prefix-change.php --help.

Массовое изменение версий

Версию можно синхронизировать на основе информации о версии в основном заголовке плагина. Например, если заголовок файла главного файла выглядит следующим образом,

<?php
/*
 * Plugin Name: Sample
 * Description: Sample plugin.
 * Version:     1.4.2
 */

// 이하 생략

Текущая версия плагина указана как 1.4.2. Однако это версия билдплатформы, и версия, которую вам нужно создать, может отличаться. Отредактируйте это число и, если необходимо, измените соответствующие переменные в файлах package.json, composer.json или в самом главном файле.

$ php bin/sync-version.php
* Target version: 1.4.2
...

Скрипт bin/sync-version.php автоматически обнаружит файл, если в корневой директории плагина или темы существует файл style.css (тема), index.php (плагин) или {имя_директории}.php (плагин).

Если используется другое имя главного файла, введите путь в качестве первого аргумента.

$ php bin/sync-version.php /path/to/main/file.php  # 메인 파일의 절대 혹은 상대 경로
...

В composer.json уже настроена команда version.

$ composer version

Использование очень просто.

Пример плагина

Установка билдплатформы

Рассмотрим создание плагина 'FOO' в качестве примера.

В директории 'wp-content/plugin' выполните следующее.

$ composer create-project naran/boilerplate foo
Creating a "naran/boilerplate" project at "./foo"

(...)

Please enter your new prefix (Enter 'exit' to skip): foo
Replace prefix from `nbpc` to `foo`. Are you sure? [Y/n] y

(...)

Все файлы будут заменены.

Редактирование файлов в корне

В корне содержатся различные файлы конфигурации плагина. Эти файлы содержат много информации о плагине и поэтому должны быть изменены сразу после установки.

Файл README.me

Файл README.md содержит базовый шаблон билдплатформы. Измените его.

Файл index.php

В файле index.php содержится заголовок плагина. Некоторые изменения уже выполнены, но还有一些 части требуют корректировки.

  • Название плагина
  • URI плагина
  • Описание
  • Версия
  • Автор
  • URI автора

И также измените число в const FOO_PRIORITY = 100; на разумное значение. Это число используется в качестве базового приоритета для действий и фильтров в модуле.

Файл composer.json

composer.json также содержит базовые значения. Измените несколько пунктов.

  • имя
  • описание
  • авторы

Файл package.json

Этот файл можно использовать, если используется Node. Измените несколько пунктов.

  • имя
  • описание

Заключение

После того как все файлы отредактированы, обновите все файлы в соответствии с версионным номером, определенным в заголовке плагина.

$ composer version

Конфигурация модуля

В файле foo/includes/class-foo-main.php определен класс Foo_Main. Этот файл является основным файлом плагина.

Перейдите к методу get_early_modules() в классе. Этот метод возвращает связный массив, ключи которого являются идентификаторами модулей, а значениями — экземплярами модулей или классами, или анонимными функциями.

Создание модуля 'bar'

尝试创建bar模块。

创建文件 foo/includes/modules/class-foo-bar.php。按照以下内容编写文件。为了明确效果,使用了wp_die()函数,请在非运行中的网站上执行。

<?php
/**
 * FOO: Bar module
 */

if ( ! defined( 'ABSPATH' ) ) {
  exit;
}

if ( ! class_exists( 'FOO_Bar' ) ) {
  class FOO_Bar extends FOO_Main_Base {
    use FOO_Hook_Impl;
    
    public function __construct() {
      $this->add_action( 'init', 'init_callback' );
    }
    
    public function init_callback() {
      wp_die( 'Intentionally stopped.' );
    }
  }
}

注册'bar'模块

目前bar模块还未工作。要使其工作,需要在主类中注册该模块。在FOO_Main类的get_early_modules()方法中注册模块。

protected function get_early_modules(): array {
  return [
    /* 생략 */
    'bar' => FOO_Bar::class,
  ];
}

此外,在Foo_Main类的注释中添加有关bar模块访问的提示。添加如下@property-read Foo_Bar $bar行。

/**
 * Class FOO_Main
 *
 * @property-read FOO_Admins    $admins
 * @property-read FOO_Registers $registers
 * @property-read Foo_Bar       $bar
 */
final class FOO_Main extends FOO_Main_Base

然后更新自动加载设置。

@composer dump-autoload

如果激活了插件,则由于wp_die()函数的原因,网站将输出“有意停止。”的消息并停止工作。

转换为动态模块

将bar模块以类名传递时,模块总是处于激活状态。但是,有时可能只想在有需要时才启用模块。

此时,修改Foo_Main::get_early_modules()方法的内容如下。

protected function get_early_modules(): array {
  return [
    /* 생략 */
    'bar' => function () { return new FOO_Bar(); },
  ];
}

将类名字符串更改为创建Foo_Bar()实例的匿名函数。现在网站将按原样运行。也就是说,在明确调用bar模块之前,模块不会创建。

现在让我们加载bar模块。通过发送任意值作为GET参数来使其工作。在index.php中,在foo();下方添加以下代码。

if ( isset( $_GET['foo'] ) && 'bar' === $_GET['foo'] ) {
    foo()->bar;
}

网站可以正常工作,但如果在URL地址的GET参数中添加'foo=bar',则网站将再次输出“有意停止。”的消息并停止工作。

首先,介绍模块(早期模块)和后续模块(晚期模块)的区别。

早期模块,通过get_early_modules()方法注册的模块的注册方式与后续模块,通过get_late_modules()方法注册的模块的注册方式相同。但是,后续模块是在init动作的低优先级回调中被调用的。

虽然这些模块会自动启动,但如果某些功能在核心注册后才能保证正常工作,则最好在get_late_modules()方法中注册。

将Boilerplate作为主题使用

通过一些修改,可以轻松将其转换为主题的基本代码。

创建style.css文件

主题必须在主题的顶级目录中放置style.css文件。以下是一个创建style.css文件的示例。

/*
Theme Name:        Naran Boilerplate Code
Theme URI:         https://github.com/chwnam/naran-boilerplate-code
Description:       Naran boilerplate code for WordPress plugins/themes.
Version:           1.3.4
Requires at least: 5.1.0
Requires PHP:      7.0
Tested up to:      5.4
Author:            changwoo
Author URI:        https://blog.changwoo.pe.kr/
License:           GPL v2 or later
License URI:       https://gnu.ac.cn/licenses/gpl-2.0.html
Text Domain:       npbc
CPBN Version:      1.3.4
*/

(可选) 添加Screenshot.png文件

默认图像大小为1200px * 900px。此图像用于主题列表。

创建functions.php文件

主题中PHP代码的入口点是functions.php。因此,在主题顶级目录中创建functions.php文件,并将index.php中的内容剪切粘贴。

然后进行重要收尾。在调用nbpc()函数之前,插入{PREFIX}_THEME = true;代码。如下所示。

<?php
/* ABSPATH check */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

require_once __DIR__ . '/vendor/autoload.php';

const NBPC_MAIN_FILE = __FILE__;
const NBPC_VERSION   = '1.3.4';
const NBPC_PRIORITY  = 100;
const NBPC_THEME     = true;

nbpc();

删除插件中的头部注释。这些内容已经移动到主题的style.css中。

创建index.php, header.php, footer.php

现在index.php是主题的模板。将其更改为主题模板,并创建header.php和footer.php文件。

使用{PREFIX}_Register_Theme_Support

在{PREFIX}_Registers类构造函数中调用assign_module()方法的参数中,取消注释以下部分。

// 'theme_support' =>{PREFIX}_Register_Theme_Support::class, // Only for themes.

解除注释。

前端模块映射

{PREFIX}_Register_Theme_Support::map_front_modules()方法中映射前端模块。映射的模块可以通过{prefix}_get_front_module()函数获取。