我有一个WordPress网站。我正在为WordPress编写一个插件,我想在插件中使用CodeIgniter框架。我遇到了这个问题,因为 CodeIgniter 引导程序文件"index.php"希望在全局范围内运行,而不是在函数内运行。
现在,在我的插件中,我执行以下操作:开始:插件代码函数 classifieds_template_redirect(){ 全球$wp; $plugin_path = plugin_dir_path(__FILE__); if (preg_match('/^CI/', $wp->request))//使用 CodeIgniter 处理请求 { 包括($plugin_路径。/索引.php"; 包括 CodeIgniter 引导程序文件 死(); }}add_action( 'template_redirect', 'classifieds_template_redirect' );结束:插件代码
引发以下错误:
致命错误:在第 47 行的/usr/local/apache/htdocs/site.utils/htdocs/CodeIgniter/system/core/Utf8.php 中的非对象上调用成员函数 item()
我相信这是由于CodeIgniter期望其引导索引.php文件在全局范围内运行。
有什么想法吗?
以下是您的选择:
- 重写以特定标识符开头的URL(使用您的网络服务器),以发送到CodeIgniter的引导程序
- 重写 CodeIgniter 的路由样板,以调整为不在全局范围内通过引导程序运行
- 在WordPress中使用一个小的MVC插件而不是CodeIgniter
我将介绍第一个,因为我认为如果你要固执地坚持使用CodeIgniter,这是最有意义的。我将给你一些使用Apache作为Web服务器的概念验证代码,并mod_rewrite来完成这个目的。
基本上,我们将实现的只是您向我们展示的代码,但相反,我们将让 Apache 为我们做到这一点,使 CodeIgniter 通过其引导程序在全局范围内运行。
您要做的就是向WordPress .htaccess
文件添加更多规则。喜欢这个:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Here's the code which rewrites the URL to your CodeIgniter plugin.
RewriteRule ^CI/(?.*)$ wp-content/plugins/ci-plugin/index.php/$1 [QSA,L]
RewriteRule ^index'.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
现在,所有对www.example.com/CI/...
的请求都将通过全局范围传递给CodeIgniter的引导程序。