使用WordPress插件重写.htaccess

pprl5pva  于 2022-11-25  发布在  WordPress
关注(0)|答案(2)|浏览(138)

我正在为一个自定义的WordPress多站点网络构建一个WordPress插件,并且有一些文件使用URL变量从第二个数据库(而不是WordPress数据库)加载信息。
在通过导航到http://website.com/NAME-HERE在WordPress之外构建的版本中,它会检查它是否是我的数据库中的用户名,如果不是,则检查它是否是我的数据库中的组,并加载对应于它的用户名或组的文件。
现在我完全不知道如何在WordPress Multisite中实现这一点。据我所知,插件不能进行.htaccess重写?我如何使它在所有的网站上工作?
如果没有,最好的方法是什么?
我需要把我的pretty.php.htaccess重写到我的根目录下,并把页面指向插件中的文件吗?如果需要,如何在多个主题下工作?
在这一点上,我认为我最好的选择是接触到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

漂亮的.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");
}
pdtvr36n

pdtvr36n1#

如果我能理解你想要达到的目标,你可以通过几种方式来实现,你可能不需要使用任何重写。
最简单的解决方案是将你的“pretty.php”代码添加到你的WordPress模板的header.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_headhttps://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文件之前,请了解权限。

lf5gs5x2

lf5gs5x22#

除了John Gile的答案之外,请清理Get参数。
在你的问题上下文中,类似$username = sanitize_text_field( $_GET['pretty'] );这样的内容应该就足够了。但是请更深入地看看需要清理的内容。
关于你最初的问题,约翰建议的第一种方法似乎更好。
假设有两个单独的请求使用相同的用户名请求相同的网址,由于文件阅读是一个阻塞流,其中一个请求必须等待流关闭,网站才会呈现。
如果您使用额外的流或任何其他方式绕过此问题,则可能导致重复条目或更糟的是损坏的文件,这可能会导致服务器错误。

编辑

我不太清楚你试图通过包括include('USERNAME.php')来实现什么,你是不是为每个注册你的“多站点网络”的用户创建一个专用的php文件?如果是这样的话,我认为你在计划这个的时候做出了错误的决定。
通常,当您希望根据外部资源共享、控制或更改行为时,您将以JSON数据格式获取数据。
现在,如果我处于您的位置,我将创建一个REST Web服务,它根据username get参数返回JSON,并根据传入的数据控制输出。
创建一个api是相当复杂的,根据你的需要,你可以选择最适合你的工具。我个人喜欢用apigility来处理复杂的事情,用lumen来处理小事情。如果你愿意,你也可以自己创建。
在创建了api之后,你可以很容易地得到file_get_contents()描述的here的JSON,或者使用你能找到的任何用于php的rest工具。

相关问题