graft/framework-core

WordPress插件开发的框架核心。

v1.0.0 2019-09-05 18:40 UTC

This package is auto-updated.

Last update: 2024-09-06 05:07:25 UTC


README

Graft是一个用于WordPress插件开发的框架。它为您的插件提供清晰的面向对象(OOP)和模型-视图-控制器(MVC)模式的代码架构。

为什么选择Graft?

面向对象(OOP)

我是一个热爱面向对象的开发者,因此当我开始WordPress开发时,我感到沮丧,因为一些插件没有使用面向对象。

当然,我明白一些小型插件不需要使用面向对象,所以这个框架是为具有复杂功能的插件而设计的。

创建更友好的开发者插件

在我的WordPress开发者经验中,当我在使用一些插件时,我经常问相同的问题

  • 这个插件使用了哪些钩子?
  • 这个插件提供了一些可用的过滤器吗?
  • 能否覆盖这个插件的模板?

Graft的主要功能

面向对象(OOP)

在一个WordPress插件中,您不必编写面向对象的代码(您可以使用仅函数),但是使用Graft,所有内容都是对象,以提高代码质量。

MVC模式和从主题中覆盖模板

Graft使用Twig模板引擎,允许您在插件中实现MVC模式。并且Graft允许开发者(如果给予权限)从他们的主题中覆盖所有插件的模板。

注释

在Graft中,由于面向对象,所有基本的WordPress函数,如add_action('wp_head')add_filter(),都是注释,如@Action(name="wp_head"),因此您不需要指定任何回调,它使用指定的方法。

容器

所有使用Graft制作的插件都有一个依赖注入容器(PHP-DI容器),用于使用自动装配您的类或Graft可注入组件。

并且容器中列出了插件使用的所有WordPress组件(动作、过滤器、管理页面等)。

示例

这是使用Graft框架的代码示例

use Graft\Framework\Annotation\Filter;   //use Filter Annotation
use Graft\Framework\Injectable\Renderer;

/**
 * Class that will be construct by the Factory
 * This class can be injected with autowiring in other Class.
 */
class MyHookManager
{
    /**
     * HookManager Renderer
     * Use for Template Rendering
     * 
     * @var Renderer
     */
    private $renderer;


    /**
     * MyHookManager Constructor
     * using autowiring for dependency injection
     * 
     * @param Renderer $renderer
     */
    public function __construct(Renderer $renderer)
    {
        $this->renderer = $renderer;
    }


    /**
     * This Method will be add to 'the_title' Filter by Annotation
     * 
     * And 'the_title' Filter will be added in the Plugin Container
     * for other developers who want to know wich Hooks this Plugin using.
     * 
     * @Filter(name="the_title")
     * 
     * @param string $title Current Title
     *
     * @return string
     */
    public function titleFilterHook(string $title)
    {
        //some example code...
        $title = trim($title);

        // using Twig for Custom Title HTML...
        // this template can be override in the Theme in
        // (wp-content/themes/mytheme/currentPluginName/filter/title.html.twig) for example.
        return $this->renderer->render('filter/title.html.twig', ['title' => $title]);
    }
}