简而言之,我正在尝试使用 WordPress 构建一个“生态系统”,其中我有一个核心插件,然后是其他附加插件。
更深入地说,每个附加插件都需要核心插件才能运行。我已经使用 WordPress 标准编码和文件结构实践实现了这一点。我正在修改这个项目,现在使用 Namespacing PSR-4、composer、bower 等。
标准 WordPress 安装
|
|__www
|
|___wp-admin
|
|___wp-content
| |
| |___plugins
| | |
| | |___my-core-plugin
| | | |
| | | |___library
| | | | |
| | | | |___class-post-register.php
| | | |
| | | |___vendor
| | | | |
| | | | |___autoload.php
| | | |
| | | |___composer.json
| | | |
| | | |___core.php
| | |
| | |___my-first-addon-plugin
| | | |
| | | |___library
| | | |
| | | |___vendor
| | | | |
| | | | |___autoload.php
| | | |
| | | |___composer.json
| | | |
| | | |___core.php
| | |
| | |___my-second-addon-plugin
| | | |
| | | |___library
| | | |
| | | |___vendor
| | | | |
| | | | |___autoload.php
| | | |
| | | |___composer.json
| | | |
| | | |___core.php
| | |
| |___themes
| | |
| | |___my-custom-theme
| |
| wp-includes
通过 composer 的核心插件 psr4
"autoload": {
"psr-4": {
"CorePlugin\\Library\\": "library"
}
}
示例核心插件类
<?php
namespace CorePlugin\library;
class Post_Register {
private __construct() {
// ... code
}
private init() {
}
private register( $data ) {
// .. code to register a custom post for example.
}
}
第一个附加插件 psr4 通过 composer
"autoload": {
"psr-4": {
"FirstAddon\\Library\\": "library"
}
}
来自附加插件的类
下面是我感到困惑的地方。我正在尝试在不同的命名空间中使用核心插件中的类,但出现错误:
Fatal error: Class 'CorePlugin\Library\Post_Register' not found in...
这两个插件都自动加载它们各自的 Composer 生成自动加载文件,所以我虽然能够使用命名空间。在我深入研究 PHP 手册的这一部分 ( http://php.net/manual/en/language.namespaces.php ) 之前,我来这里是想问一下,我可能会在哪里尝试子命名空间。
<?php
namespace FirstAddon;
use CorePlugin\Library\Post_Register;
class First_Addon {
private __construct() {
// ... code
}
private init() {
}
private another_function() {
}
}
此外,我对使用带括号的子命名空间犹豫不决,因为例如,在 laravel 中,使用foo\bar;和使用 bar\foo;像这样。
<?php namespace App\Services;
use App\User;
use Validator;
use Illuminate\Contracts\Auth\Registrar as RegistrarContract;
class Registrar implements RegistrarContract {
最佳答案
我确定您已经离开这里,但我想我还是会回答,以防其他人试图让插件相互依赖。我在我的插件中使用类和 namespace 。我的插件重用彼此的类。
首先,它基本上归结为 Wordpress 加载插件的顺序。我自己来自 C#/Java,最初对 WP 的工作方式感到困惑。您要确保您要使用的插件已经加载。执行此操作的最佳方法是通过后期 Hook 实例化类 - 您知道在加载插件后发生的 Hook 。一个例子可以是
add_action('plugins_loaded', function () { new whatever() });
然后让构造函数在其他插件(或任何您需要的地方)中使用该类:
function __construct() {
$other_plugin_class = new \Namespace\To\Other\Plugin\MyClass();
}
如果插件相互依赖,并且需要根据启用的插件和未启用的插件采取不同的操作,您可以这样做:
if ( ! function_exists( 'is_plugin_active' ) )
require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
if ( is_admin() and is_plugin_active('myplugin1/plugin1.php') ) {
add_action( 'admin_menu', array( $this, 'add_a_menu_depending_on_another_plugin' ), 99 );
}
首先确保我们需要的功能已经加载,然后检查相关插件是否启用。
值得一提的是,我使用了内置的自动加载器:
spl_autoload_register( 'my_autoloader' );
function my_autoloader( $class_name ) {
if ( false !== strpos( $class_name, 'Nuvobook' ) ) {
$classes_dir = plugin_dir_path( __DIR__ );
$class_file = strtolower(str_replace( '_', '-', str_replace( '\\', DIRECTORY_SEPARATOR, $class_name ) ) . '.php');
include_once $classes_dir . $class_file;
}
}
.. 将我的 My_Class 类命名约定映射到文件名 my-class.php
这一切都很棒。
希望对某人有所帮助。
关于php - WordPress PSR-4 命名空间插件访问另一个命名空间插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32408957/
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我在一个静态网站上工作(因此没有真正的服务器支持),我想在另一个网站中包含一个小的细长片段,可能会向它传递一个变量。这可能吗?在rails中很容易,虽然是render方法,但我不知道如何在slim上做(显然load方法不适用于slim)。 最佳答案 Slim包含Include插件,允许在编译时直接在模板文件中包含其他文件:require'slim/include'includepartial_name文档可在此处获得:https://github.com/slim-template/slim/blob/master/doc/incl
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba