Подтвердить что ты не робот

.htaccess переписать с плагином WordPress

Я работаю над созданием плагина WordPress для пользовательской многосайтовой сети WordPress и нескольких файлов, использующих переменные URL для загрузки информации из второй базы данных (а не из базы данных WordPress).

В версии, построенной вне WordPress, перейдя на http://website.com/NAME-HERE, она проверит, является ли это имя пользователя в моей базе данных, если не проверяет, есть ли ее группа в моей базе данных и загружает файл, соответствующий if его имя пользователя или группу.

Теперь я полностью потерял возможность реализовать это в 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 an event.
}else if(checkIfStreamByPretty($_GET['pretty'])){
    $_GET['id'] = getStreamIdFromPretty($_GET['pretty']);

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

    include("404.php");
}

Я хочу предоставить больше контекста того, что я ищу, я создаю файлы шаблонов страниц, один из которых для профилей, и один из них для групп, как вы видели выше моего .htaccess и pretty.php я затем в верхней части файла шаблона страницы, используя

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

Я действительно пытаюсь понять, как это сделать, чтобы он работал с несколькими темами. Просто ищем любое решение на данный момент.

4b9b3361

Ответ 1

Есть несколько способов, которыми вы могли бы приблизиться к этому, если я понимаю, чего вы хотите достичь. Вероятно, вам не нужно использовать какие-либо перезаписи.

Самое простое решение - добавить ваш код "pretty.php" в файл header.php в вашем шаблоне Wordpress. Это будет загружаться по каждому запросу на переднюю часть веб-сайта. Если вам нужно загрузить код только на определенной странице, просто проверьте, на какой странице вы используете 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.

Ответ 2

В дополнение к ответу от Джона Гила, пожалуйста, дезинфицируйте параметры Get. Вы можете прочитать о некоторых вариантах дезинфекции здесь

В вашем контексте вопросов что-то вроде $username = sanitize_text_field( $_GET['pretty'] ); Должно быть достаточно. Но, пожалуйста, взгляните глубже на то, что нужно для дезинфекции.

Что касается вашего первоначального вопроса, то первый подход, предложенный Джоном, кажется лучшим.

Рассмотрим момент, когда два отдельных запроса запрашивают один и тот же URL с тем же именем пользователя. Поскольку File Reading/Writing является блокирующим потоком, один из запросов должен ждать завершения потока, и веб-сайт не будет отображаться до тех пор, пока это не произойдет.

Если вы обходите это дополнительным потоком или тем, что рискуете получить дублирующиеся записи или хуже поврежденный файл, который может привести к ошибкам сервера.

Edit

Я не совсем уверен, чего вы пытаетесь достичь, включая include('USERNAME.php'), создаете ли вы специальный файл php для каждого пользователя, который подписывается на вашу "многосайтовую сеть"? Если это так, я думаю, что вы приняли неправильные решения при планировании этого.

Обычно, когда вы хотите делиться, управлять или изменять поведение в зависимости от внешних ресурсов, вы должны получать данные в формате данных JSON.

Теперь, если бы я был на твоем месте, я бы создал веб-службу REST, которая возвращает JSON в зависимости от параметра доступа пользователя и управления выход в зависимости от входящих данных.

Создание api довольно сложно и зависит от ваших потребностей, которые вы бы использовали с любым инструментом, который подходит именно так. Мне лично понравилось работать с apigility для довольно сложных вещей и lumen для мелочей. Вы также можете создать это самостоятельно, если вы выберете тоже.

После создания api вы можете легко получить JSON с file_get_contents() описанным здесь или использовать любой инструмент для отдыха, который вы можете найти для php.