问题描述
如何整合 CodeIgniter 和 WordPress,以便将 WordPress 博客的外观和模板转移到 CodeIgniter-created 页面?
最佳解决方案
第一步是将 CodeIgniter 和 WordPress 文件移动到自己的目录中。
之后,将以下行放在 CodeIgniter 的 index.php
文件的顶部。根据需要将路径更改为 wp-blog-header.php
,以指向您的 WordPress 的根目录。
<?php
require('../wp-blog-header.php');
然后,您可以在视图中使用以下功能:
<?php
get_header();
get_sidebar();
get_footer();
?>
WordPress 的文档中也可以找到其他帮助函数,可帮助您集成设计。
次佳解决方案
当我在 Codeigniter 的 index.php 页面中包含文件 wp-blog-header.php 时,我遇到了一个问题,即 site_url() 是在 codeigniter 的 URL 帮助器和 WordPress 中定义的。我使用以下代码解决了这个问题:
require('blog/wp-blog-header.php');
add_filter('site_url', 'ci_site_url', 1);
function ci_site_url() {
include(BASEPATH.'application/config/config.php');
return $config['base_url'];
}
header("HTTP/1.0 200 OK");
最后一行需要添加,因为 WordPress 文件正在向头添加 HTTP 响应头 「HTTP /1.0 404 Page not found」 。
现在可以使用 WordPress 函数调用 CodeIgntier 。
第三种解决方案
这是在您的代码标识符项目中使用 WordPress 模板的另一种方式。这对我来说更好,所以我想分享它。用 WordPress 3.3.1 和 Codeigniter 2.1 进行测试。
目录结构:
/ - WordPress
/ci/ - codeigniter
/ci/index.php(CI 索引文件顶部)
$wp_did_header = true;
if ( defined('E_RECOVERABLE_ERROR') )
error_reporting(E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR);
else
error_reporting(E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING);
require_once("../wp-config.php");
通过覆盖默认的 codeigniter 版本来处理 site_url 功能的冲突。您将需要更改任何在 Codeigniter 中使用 site_url()
的地方,以改用 ci_site_url()
。
/ci/application/helpers/MY_url_helper.php
<?php
function anchor($uri = '', $title = '', $attributes = '')
{
$title = (string) $title;
if ( ! is_array($uri))
{
$site_url = ( ! preg_match('!^w+://! i', $uri)) ? ci_site_url($uri) : $uri;
}
else
{
$site_url = ci_site_url($uri);
}
if ($title == '')
{
$title = $site_url;
}
if ($attributes != '')
{
$attributes = _parse_attributes($attributes);
}
return '<a href="'.$site_url.'"'.$attributes.'>'.$title.'</a>';
}
if ( ! function_exists('ci_site_url'))
{
function ci_site_url($uri = '')
{
$CI =& get_instance();
return $CI->config->site_url($uri);
}
}
function current_url()
{
$CI =& get_instance();
return $CI->config->ci_site_url($CI->uri->uri_string());
}
function anchor_popup($uri = '', $title = '', $attributes = FALSE)
{
$title = (string) $title;
$site_url = ( ! preg_match('!^w+://! i', $uri)) ? ci_site_url($uri) : $uri;
if ($title == '')
{
$title = $site_url;
}
if ($attributes === FALSE)
{
return "<a href='javascript:void(0);' onclick="window.open('".$site_url."', '_blank');">".$title."</a>";
}
if ( ! is_array($attributes))
{
$attributes = array();
}
foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0', ) as $key => $val)
{
$atts[$key] = ( ! isset($attributes[$key])) ? $val : $attributes[$key];
unset($attributes[$key]);
}
if ($attributes != '')
{
$attributes = _parse_attributes($attributes);
}
return "<a href='javascript:void(0);' onclick="window.open('".$site_url."', '_blank', '"._parse_attributes($atts, TRUE)."');"$attributes>".$title."</a>";
}
function redirect($uri = '', $method = 'location', $http_response_code = 302)
{
if ( ! preg_match('#^https?://#i', $uri))
{
$uri = ci_site_url($uri);
}
switch($method)
{
case 'refresh' : header("Refresh:0;url=".$uri);
break;
default : header("Location: ".$uri, TRUE, $http_response_code);
break;
}
exit;
}
您现在可以使用 WordPress get_header()
和/或 get_footer()
函数在 CI 项目中绘制模板。
第四种方案
我正在使用 Wordpress 来管理自定义 CI e-commerce 网站中的文章。 CI 是我的主要网站。目录结构如下:
/application (CI)
/... (directories like javascript, stylesheets ...)
/system (CI)
/wordpress
/.htaccess
/index.php (CI)
我可以在我的 CI 控制器中使用 Wordpress 功能,当我将以下代码添加到 CI 的 index.php 顶部时,我的 URL 不会被弄乱:
require_once './wordpress/wp-blog-header.php';
add_filter('site_url', 'ci_site_url', 1);
function ci_site_url($uri = '') {
$CI =& get_instance();
$uri = ltrim(str_replace($CI->config->base_url('wordpress/'), '', $uri),'/'); // "wordpress/" is in my case the name of the directory where I installed WordPress. See directory structure above.
return $CI->config->site_url($uri);
}
使用 JérômeJaglale(http://jeromejaglale.com/doc/php/codeigniter_i18n) 使用 CI i18n 库时也可以。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。