lin3s / wp-foundation
使用LIN3S方式构建WordPress主题的辅助类
Requires
- php: ^5.5 || ^7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^1.11
- lin3s/wp-phpspec-brigde: ^0.1
- phpspec/phpspec: ^2.5
- dev-master
- v1.7.1
- v1.7.0
- v1.6.4
- v1.6.3
- v1.6.2
- v1.6.1
- v1.6.0
- v1.5.0
- v1.4.1
- v1.4.0
- v1.3.7
- v1.3.6
- v1.3.5
- v1.3.4
- v1.3.3
- v1.3.2
- v1.3.1
- v1.3.0
- v1.2.5
- v1.2.4
- v1.2.3
- v1.2.2
- v1.2.1
- v1.2
- v1.1.11
- v1.1.10
- v1.1.9
- v1.1.8
- v1.1.7
- v1.1.6
- v1.1.5
- v1.1.4
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- dev-feature/fixed-issue-with-field-components
- dev-fix/no-name-field-component
- dev-refactor/fix-null-posttype-name
- dev-feature/refactor-and-simplify-post-types
- dev-feature/v2.0.0
- dev-fix/missing-file-headers
- dev-fix/spec-file-headers
- dev-fix/file-headers
- dev-fix/readme-styling
- dev-feature/update
This package is not auto-updated.
Last update: 2024-09-14 18:04:12 UTC
README
使用LIN3S方式构建WordPress主题的辅助类
为什么?
在实施了几种WordPress主题之后,我们构建了我们认为可以被认为是以干净、一致和快速的方式构建此类项目的最佳实践的解决方案:因此诞生了LIN3S的WordPress标准版。我们对此感到非常满意,但有一些任务是重复且繁琐的,而且每个开发人员通常以不同的方式实现,因此,通过这个库,我们试图避免这类麻烦。目前,WPFoundation只包含一组接口
和抽象类
(未来谁知道呢:)),以强迫所有开发人员遵循相同的方式,使我们的代码更加一致。
安装
推荐且最合适的方式是通过Composer安装。请确保该工具已安装在您的系统上,并执行以下命令
$ composer require lin3s/wp-foundation
使用示例
以下代码片段是表示如何使用此库的代表性代码示例
- Ajax
- 配置
- 文章类型
- Twig
- 小工具
Ajax
(...) use LIN3S\WPFoundation\Ajax\Ajax; final class MyAwesomeAjax extends Ajax { /** * {@inheritdoc} */ protected $action = 'my_awesome_ajax'; /** * {@inheritdoc} */ public function ajax() { (...) die('returning data'); } }
ACF
ACF配置类,这个类负责所有与这个WordPress插件相关的逻辑。目前这个API只有一个方法,允许无缝地使用ACF中此类字段的多WYSWYG配置。
(...) use LIN3S\WPFoundation\Configuration\Acf\Acf; final class Acf extends BaseAcf { /** * {@inheritdoc} */ public function wyswygToolbars() { return [ 'basic' => [1 => ['bold', 'italic']], 'lin3s' => [1 => ['bold', 'italic', 'bullist', 'numlist', 'link', 'unlink']], ]; } }
资源
(...) use LIN3S\WPFoundation\Configuration\Assets\Assets as BaseAssets; final class Assets extends BaseAssets { /** * {@inheritdoc} */ public function productionAssets() { $this ->addScript('app.min', self::BUILD_JS, ['jquery', 'jquery.counterup', 'sidr']); } /** * {@inheritdoc} */ public function developmentAssets() { $this ->addScript('jquery.sidr.min', self::VENDOR . '/sidr') ->addScript('waypoints', self::VENDOR . '/jquery-waypoints') ->addScript('jquery.counterup', self::VENDOR . '/Counter-Up') ->addScript('counter', self::ASSETS_JS, ['jquery', 'jquery.sidr.min', 'waypoints', 'jquery.counterup']) ->addScript('typekit', self::ASSETS_JS, [], '1.0.0', false) ->addScript('menu') ->addScript('accordion') ->addScript('post-ajax', self::ASSETS_JS, [], '1.0.0', false, 'postsAjax') } /** * {@inheritdoc} */ public function adminAssets() { $this->addStylesheet('adminCss'); $this->addScript('adminScript'); } }
邮件发送器
Mailer
类配置了使用wp_mail()
发送电子邮件的方式。您应该通过编辑WordPress配置文件来配置邮件发送器参数。默认参数适用于localhost smtp发送。
您可以定义自己的自定义邮件发送器,该发送器实现MailInterface
并使用上述两种策略之一创建wp_mail()
配置选择的实例。
(...) use LIN3S\WPFoundation\Configuration\Mailer\MailInterface; use Timber; final class ContactMail implements MailInterface { /** * {@inheritdoc} */ public static function mail($request) { wp_mail( MAILER_TO, 'Contact' Timber::compile('mail/mail.twig', ['request' => $request]), ['Content-Type: text/html; charset=UTF-8'] ); } }
MailerInterface
已弃用,并将从 v2.0.0 版本中移除。请直接使用 wp_mail() 函数发送邮件。
菜单
// src/App/App.php use LIN3S\WPFoundation\Configuration\Menus\Menus class App extends Theme { public function classes() { (...) new Menus([ self::MENU_AWESOME => 'Awesome menu' ] } }
主题
(...) use LIN3S\WPFoundation\Configuration\Theme\Theme; final class AwesomeTheme extends Theme { /** * {@inheritdoc} */ public function classes() { new Assets(); new Acf(); new Mailer(); new Menus(); new CustomPostType(); } /** * {@inheritdoc} */ public function templates($templates) { return array_merge($templates, [ 'index' => 'Index', 'customs' => 'Customs', ]); } /** * {@inheritdoc} */ public function context(array $context) { $context['mainMenu'] = new TimberMenu('main-menu'); $data['lang'] = ICL_LANGUAGE_CODE; return $context; } }
翻译
\LIN3S\WPFoundation\Configuration\Translations\Translations::trans('Your awesome string');
文章类型
声明一个文章类型就像创建一个新的 PostType
实例一样简单。
// src/App/App.php class App extends Theme { public function classes() { (...) new PostType( PostTypes::CUSTOM_POST_TYPE, [ 'labels' => [ 'name' => Translations::trans('Exhibitions'), 'singular_name' => Translations::trans('Exhibition'), ], 'has_archive' => true, 'public' => true, 'publicly_queryable' => true, 'query_var' => true, 'show_in_rest' => true, 'show_ui' => true, 'supports' => ['title', 'editor', 'thumbnail'], ] ) } }
要向自定义文章类型添加自定义字段,只需创建一个 Fields
实例。
// src/App/App.php class App extends Theme { public function classes() { (...) new Fields( PostTypes::CUSTOM_POST_TYPE, [ Fully\Qualified\Namespace\Components\CustomFieldComponent::class, ], new PostTypeFieldConnector(PostTypes::CUSTOM_POST_TYPE) ['editor'], ['comments'] ); } }
字段
(...) use LIN3S\WPFoundation\PostTypes\Field\FieldComponent; final class CustomFieldComponent extends FieldComponent { /** * {@inheritdoc} */ public static function definition($aName) { return [ 'key' => sprintf('field_%s_component', $aName), (...) ]); } }
(...) use LIN3S\WPFoundation\PostTypes\Fields\PageFields as BasePageFields; final class PageFields extends BasePageFields { /** * {@inheritdoc} */ private $name = 'my_awesome_template; /** * {@inheritdoc} */ public function components() { return [ 'Fully\Qualified\Namespace\Components\CustomFieldComponent', ]; ]; }
重写规则
(...) use LIN3S\WPFoundation\PostTypes\RewriteRules\RewriteRules; final class CustomRewriteRules extends RewriteRules { /** * {@inheritdoc} */ public function rewriteRules() { add_rewrite_rule( '^custom-base-url/([^/]*)/([^/]*)/([^/]*)/?$', 'index.php?category=$matches[1]&subcategory=$matches[2]&custom=$matches[3]', 'top' ); add_rewrite_rule( '^custom-base-url/([^/]*)/([^/]*)/?$', 'index.php?category=$matches[1]&subcategory=$matches[2]', 'top' ); } /** * {@inheritdoc} */ public function rewriteTags() { add_rewrite_tag('%category%', '([^/]*)'); add_rewrite_tag('%subcategory%', '([^/]*)'); add_rewrite_tag('%custom%', '([^/]*)'); } /** * {@inheritdoc} */ public function templateInclude($template) { $controller = new CustomController(); $method = ''; if (get_query_var('category') !== '' && get_query_var('subcategory') !== '' && get_query_var('custom') != '' ) { $method = 'showAction'; } elseif (get_query_var('category') !== '' && get_query_var('subcategory') !== '' ) { $method = 'listAction'; } return $method === '' ? $template : $controller->$method(); } }
TagManagerTwig
在您的主题中实例化 TagManagerTwig
后,您可以按以下方式调用:
(...) {% block tagManager %} {{ tagManager('GTM-XXXXXX') }} {% endblock %}
TranslationTwig
在您的主题中实例化 TranslationTwig
后,您可以按以下方式调用:
(...)
{{ trans('Your awesome string') }}
小工具
(...) use LIN3S\WPFoundation\Widgets\Widget; final class SocialNetworksWidget extends Widget { /** * {@inheritdoc} */ public function widget($args, $instance) { $data = [ 'beforeWidget' => $args['before_widget'], 'afterWidget' => $args['after_widget'], 'beforeTitle' => $args['before_title'], 'afterTitle' => $args['after_title'], 'twitterUrl' => (!empty($instance['twitterUrl'])) ? strip_tags($instance['twitterUrl']) : '', 'facebookUrl' => (!empty($instance['facebookUrl'])) ? strip_tags($instance['facebookUrl']) : '', 'pinterestUrl' => (!empty($instance['pinterestUrl'])) ? strip_tags($instance['pinterestUrl']) : '', 'youtubeUrl' => (!empty($instance['youtubeUrl'])) ? strip_tags($instance['youtubeUrl']) : '', 'rssUrl' => (!empty($instance['rssUrl'])) ? strip_tags($instance['rssUrl']) : '', ]; return Timber::render('widgets/front/socialNetworks.twig', $data); } /** * {@inheritdoc} */ public function form($instance) { $instance['widgetNumber'] = $this->number(); $instance['widgetName'] = $this->name(); return Timber::render('widgets/admin/socialNetworks.twig', $instance); } /** * {@inheritdoc} */ public function update($newInstance) { $instance = [ 'twitterUrl' => (!empty($newInstance['twitterUrl'])) ? strip_tags($newInstance['twitterUrl']) : '', 'facebookUrl' => (!empty($newInstance['facebookUrl'])) ? strip_tags($newInstance['facebookUrl']) : '', 'pinterestUrl' => (!empty($newInstance['pinterestUrl'])) ? strip_tags($newInstance['pinterestUrl']) : '', 'youtubeUrl' => (!empty($newInstance['youtubeUrl'])) ? strip_tags($newInstance['youtubeUrl']) : '', 'rssUrl' => (!empty($newInstance['rssUrl'])) ? strip_tags($newInstance['rssUrl']) : '', ]; return $instance; } }
小工具区域
(...) use LIN3S\WPFoundation\Widgets\Areas\WidgetArea; final class CustomWidgetArea extends WidgetArea { /** * {@inheritdoc} */ public function widgetArea() { register_sidebar([ 'name' => 'Custom widgets', 'id' => 'custom-widgets', 'before_widget' => '<section class="custom-widget">', 'after_widget' => '</section>', 'before_title' => '<h5>', 'after_title' => '</h5>', ]); } }