2017-09-27 25 views
17

私は、カスタムWordPressのマルチサイトネットワーク用のWordPressプラグインの作成に取り組んでおり、URL変数を使用して2番目のデータベース(WordPressデータベースではない)から情報を読み込むいくつかのファイルがあります。.htaccess WordPressプラグインで書き直し

http://website.com/NAME-HEREにナビゲートしてWordPressの外でビルドしたバージョンでは、データベースのユーザー名であるかどうかを確認します。データベースのグループが存在するかどうかを確認し、ユーザー名またはグループ。

これをWordPress Multisiteに実装することについて、私は完全に迷っています。私の知る限りでは、プラグインは書き換えることができません.htaccess?すべてのネットワークサイトでそれを動作させるにはどうすればよいですか?

これを達成するための最良の方法は何ですか?

pretty.php & .htaccessをルートディレクトリに書き直し、そのページをプラグインにあるファイルにポイントする必要がありますか?もしそうなら、これは複数のテーマでどのように機能しますか?

私の唯一の考えはまだありません。おそらくこれはRewriteMapのようなもので実現できます。

この時点で、私は自分の最善の策がStackOverflowコミュニティに手助けや指示のために手を差し伸べることだと考えました。

の.htaccess

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 

RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA] 

ErrorDocument 404 /404.php 

pretty.php

// First check if passed pretty parameter is a username. 
if(checkIfUserByUsername($_GET['pretty'])) 
{ 
    $_GET['username'] = $_GET['pretty']; 

    include("USERNAME.php"); 

// If not a username, check to see if it's an event. 
}else if(checkIfStreamByPretty($_GET['pretty'])){ 
    $_GET['id'] = getStreamIdFromPretty($_GET['pretty']); 

    include("GROUP.php"); 
}else{ 
    // If it's none, redirect to the 404 page. 

    include("404.php"); 
} 

私は、ページテンプレートファイルにのいずれかを作成しています、私は達成するために探しています何のより多くのコンテキストを提供したいですあなたが私の.htaccessとpretty.phpの上で見たようなグループのためのものです。私はページテンプレートファイルの一番上にあります。

$user_id = getIdFromUsername($_GET['username']); 
$_GET['user_id'] = $user_id; 

私は、これを複数のテーマで動作させる方法でどのように動くかを理解することに本当に苦労しています。この時点でどんな解決策も探しているだけです。

+0

希望の結果として達成しようとしていることは明確ではありません。遭遇した闘争とは対照的に、実際に起こりたいことをより簡潔にするために質問を分解してください。 '.htaccess'の編集に関しては、' All in One WP Security&Firewall'のように '.htaccess'ファイルを編集する他のプラグインをチェックアウトすることができます。 – fyrye

+0

私がexample.com/Dustinに行くと、そのユーザー名またはグループがあるかどうかを調べ、それがあるページテンプレートファイルを表示します。 –

+0

でも作成されたマルチサイトのためには、example.com/SITE/Dustin –

答えて

5

達成したいことを理解していれば、これにアプローチする方法はいくつかあります。おそらく、書き換えを使用する必要はありません。

最も簡単な解決策は、Wordpressテンプレートのheader.phpファイルに「pretty.php」コードを追加することです。これは、ウェブサイトのフロントエンドへのリクエストごとに読み込まれます。特定のページにのみコードをロードする必要がある場合は、is_pageを使用しているページを確認してください。例えば

、あなたのheader.phpの中:

if(is_page("groups")){ 
    if(checkIfUserByUsername($_GET['pretty'])) 
    { 
    // the rest of your code 
    } 
} 

あなたはWordpressのプラグインを作成したい場合、あなたは自分のプラグインで "add_action" を使用する必要があります。ここでも

add_action('wp_head', 'function_containing_your_code'); 

、これはすべてのページにロードされますので、コードをロードするページに自分のページがあることを確認してください。

https://codex.wordpress.org/Plugin_API/Action_Reference/wp_head https://developer.wordpress.org/reference/functions/is_page/

また、あなたはあなたのユーザーが編集する権限を持っている任意のファイルを編集することができます同じように、あなたの.htaccessファイルを編集することができます。 Apacheサーバを実行していると仮定すると、.htaccessファイルにはファイルを編集できる権限が必要で、PHPでファイルを編集することができます。

$file = fopen("/path/to/.htaccess", "a+"); 
fwrite($f, "RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA]"); 
fclose($f); 

多くの人が、PHPを.htaccessファイルに書き込むことがセキュリティ上のリスクであると言います。私はある状況でそれが本当であると言うでしょうが、必ずしもそうではありません。 PHPがあなたの.htaccessファイルに書き込むことを許可する前に許可を理解してください。

+0

でも動作する必要があります。とにかくSkypeなどでチャットできますか? –

+0

.htaccessのリライトは機能していますが、メインのサイトにのみ適用され、ネットワーク内のすべてのサイトには適用されません。 –

+0

これも私がやっていた方向でした。 Wordpressに '.htaccess'への書き込みアクセス権を与え、生産に変更を加えることは悪い習慣であると私は言います。 1回の悪い書き込みは、サイトのネットワーク全体を破壊するでしょう。サーバの設定やサードパーティ製のプラグインの用途によっては、 '.htaccess'の編集が望ましくないかもしれません。例えばサーバーサイドとクライアントサイドのキャッシュを使用して、新しいルールの適用を防ぎます。そうすることで、リクエストごとに処理する必要のある多くの書き換えルールがあるため、応答性が低下することさえあります。 – fyrye

2

John Gileの回答に加えて、Getパラメータを消毒してください。いくつかのサニタイズオプションについて読むことができますhere

$username = sanitize_text_field($_GET['pretty']);のような内容で十分でしょう。しかし、消毒が必要なものについてもっと深く見てください。

元の質問については、ジョンが提案した最初のアプローチが優れているようです。

2人の別々のリクエストが同じユーザー名で同じURLをリクエストしている瞬間を考慮してください。ファイルの読み書きはブロッキングストリームなので、リクエストの1つはストリームが閉じるのを待たなければならず、ウェブサイトはレンダリングされません。

これを追加のストリームで迂回するか、重複したエントリで終わる危険性があるか、サーバーエラーにつながる可能性のある破損したファイルを悪化させる可能性があります。

編集

I'amないあなたがあなたの「マルチサイトネットワーク」にサインアップユーザーごとに専用のPHPファイルを作成しているinclude('USERNAME.php')を含めて達成しようとしている何をかなり確実?その場合、私はあなたがこれを計画するときに間違った決定をしたと思います。

通常、外部リソースに応じて動作を共有、制御、または変更する場合は、データ形式をJSONにフェッチします。

私はあなたの靴にあったならば今、私は、ユーザー名に応じて、JSONは、パラメータを取得し、入ってくるデータに応じた出力を制御返しREST Webサービスを作成したい。

APIを作成するには、かなり複雑ですあなたのニーズに応じて、これらのツールに合ったツールを選ぶことができます。私は個人的にはかなり複雑なもののためにapigility、小さなもののためにlumenを使って楽しんでいました。選択した場合は、これを自分で作成することもできます。

apiを作成した後は、file_get_contents()と記述されたhereのJSONを簡単に取得できます。また、PHP用の残りのツールを使用することもできます。

+1

Rewriteルールを使用していればOKです。RewriteRule ^(\ w。+)$ ./pretty.php?pretty=$1 [QSA]メインサイトだけでなく、どのマルチサイトサイトでも動作させるにはどうすればよいですか? –

関連する問題