分散チームで働いているとしましょう。 デザイナーは、遠く神秘的な国のどこかに座っており、彼から入手できるものはすべて、WordPress用に作成されたテンプレートです。 そして、ささいな機能とはかけ離れたサイトを追加する必要があります。 WordPressのコアに触れることはできず、プラグインの機能はまったく適していません(おそらく、標準のフックセットがないか、このエンジンが気に入らないので、何かが起こる可能性があります)。
最初の衝動は、適切なエンジンまたはフレームワーク(ZFなど)を取得し、設計をそれに移して静かに動作することです。 しかし、ここに問題があります。新しい機能を作成してプロジェクトを終了すると、デザイナーとサポートは残ります。 そして、彼らはZFで何ができるのかわからず、何もできたくありません。
あなたが同様の状況で抜け出す方法に興味があるなら、私はあなたをカットすることを勧めます
コンセプトはこれです。 すべての非標準機能はZFによって実行され、WPは結果を表示します。たとえば、単一のページまたは投稿のコンテンツと同じです。 T.O. デザイナーは任意のページのフレーム(ヘッダー、フッターなど)を自由に変更できます。新しいフレームはZFのページにも適用されます。 サポートは、何も起こらなかったかのように、静的なページとニュースを編集し、ZF機能へのリンクが必要な場所に挿入し、
最初に行う必要があるのは、WPにZFのコンテンツに特定の種類のリクエストを依頼することです。たとえば、/ do / account / signup /
もちろん、プラグインシステムを使用します。 ここにのみ、wordPressaから投稿をプルするのではなく、何らかの関数を介してコンテンツを呼び出すことを可能にするフックはありません。 誰かがそれを見つけたら、教えてください:)だから、コンテンツが準備される前に存在し、呼び出されるフックを裏切りに使用します。
幸いなことに、http要求はWP_Queryクラスによって解析され、ページのコンテンツは同じクラスによって準備されます。 WPはこのクラスの1つのグローバルオブジェクトを使用します。 後悔することなく、このオブジェクトをWP_Queryクラスの継承者の偽のインスタンスに置き換えます。 私が導いているものを感じますか? 正しく、get_posts()関数はオーバーライドされます。
個人的には、最初に標準メソッドを呼び出します。すべてのグローバルオブジェクトに標準データを入力し、データベースからデフォルトページを引き出して表示します。一般的には素晴らしいです。それなしでは私にとっては難しいでしょう。
次に、デフォルトのページコンテンツをZFの結果に置き換えます。
define('ZF_MARKER', 'do');
add_action('parse_request', 'zf_query_controller');
function zf_query_controller() {
parse_str($_SERVER['QUERY_STRING'], $params);
if(isset($params[ZF_MARKER])) {
global $wp_the_query;
$q = new ZF_Query();
$q->copyFrom($wp_the_query);
$zf_uri = trim($params[ ZF_MARKER ], "/ ");
$q->req_uri_zf = empty($zf_uri)? '/' : '/' . $zf_uri . '/';
$wp_the_query = $q;
}
}
class ZF_Query extends WP_Query
{
public $req_uri_original = '';
public $req_uri_zf = '';
function copyFrom(WP_Query $wp_query) {
$vars = get_object_vars($wp_query);
foreach($vars as $name => $value) {
$this->$name = $value;
}
}
function &get_posts() {
parent::get_posts();
$post_zf = array(
"ID" => 1,
"post_author" => 1,
"post_date" => '',
"post_date_gmt" => '',
"post_content" => '',
"post_title" => '',
"post_excerpt" => "",
"post_status" => "publish",
"comment_status"=> "open",
"ping_status" => "open",
"post_password" => "",
"post_name" => "",
"to_ping" => "",
"pinged" => "",
"post_modified" => "",
"post_modified_gmt"=> "",
"post_content_filtered"=> "",
"post_parent" => 0,
"guid" => "",
"menu_order" => 1,
"post_type" => ZF_MARKER,
"post_mime_type"=> "",
"comment_count" => "0",
"ancestors" => array(),
"filter" => "",
);
$tmp = $_SERVER['REQUEST_URI'];
$_SERVER['REQUEST_URI'] = $this->req_uri_zf;
$post_zf['post_content'] = require_once ABSPATH . 'zf-app/public/index.php';
$_SERVER['REQUEST_URI'] = $tmp;
global $post;
$post = (object)$post_zf;
$this->posts = array($post);
$this->post = $post;
$this->post_count = count($this->posts);
$this->current_post = 0;
$this->is_single = 1;
$this->is_page = 0;
$this->is_404 = 0;
$this->is_archive = 0;
$this->is_home = 0;
// 2 , wordPress ( 3.x) , .
global $wp_filter;
unset($wp_filter['template_redirect']);
return $this->posts;
}
}
そしてもちろん、.haccessのルール:
RewriteRule /?do/(.*) /index.php?do=$1 [L]
それなしでも可能ですが、ZF機能のURLは/?Do = account / signup /という形式になります。
また、ZFを変更する必要があります。応答を表示するのではなく、返す必要があります。
$controller->returnResponse(true);
$resp = $application->bootstrap()->getBootstrap()->run();
return $resp->getBody();
返されたHTMLは<html>タグと<body>タグなしで必要なので、レイアウトを無効にするか、次のようにプリミティブにします。
<?php echo $this->layout()->content ?>
それだけです。
PS:別のポイント。 WPに特にZFコンテンツを処理する方法を教える必要がある場合は、使用するテーマのSingle.phpテンプレートに移動して、適切な場所に記述できます。
<?php the_post(); if (ZF_MARKER == $post->post_type) : ?>
<?php echo $post->post_content;?>
<?php else:?>
...
<?php endif; ?>
これには、次の行が必要でした:
$this->is_single = 1;
$this->is_page = 0;
$this->is_404 = 0;
$this->is_archive = 0;
$this->is_home = 0;