.htaccess 用 WordPress 插件重写

我正在努力为自定义WordPress多站点网络构建WordPress插件,并有一些文件使用URL变量从第二个数据库(不是WordPress数据库)加载信息。

在WordPress之外构建的版本中,通过导航到它将检查它是否是我数据库中的用户名,如果没有,请检查它是否是我数据库中的组,并加载与它是用户名或组相对应的文件。http://website.com/NAME-HERE

现在我完全迷失了在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");
}

答案 1

有几种方法可以解决这个问题,如果我理解你想要实现的目标。您可能不需要使用任何重写。

最简单的解决方案是将“漂亮.php”代码添加到Wordpress模板中的标题.php文件中。这将加载到网站前端的每个请求上。如果您需要它仅在特定页面上加载代码,只需检查您正在使用的页面is_page。

例如,在标头中.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

除了 John Gile 的回答之外,请清理 Get 参数。您可以在此处阅读有关一些消毒选项的信息

在你的问题上下文中,像“应该”这样的东西就足够了。但请更深入地了解需要消毒的内容。$username = sanitize_text_field( $_GET['pretty'] );

关于你最初的问题,约翰建议的第一种方法似乎是更好的方法。

考虑两个单独的请求请求具有相同用户名的同一URL的时刻。由于文件读取/写入是阻塞流,因此其中一个请求必须等待流关闭,并且网站不会呈现,直到发生这种情况。

如果您通过额外的流或其他任何风险绕过它,则最终会出现重复的条目,或者更糟糕的是,可能导致服务器错误的损坏文件。

编辑

我不太确定你试图实现什么,包括你是否为每个注册你的“多站点网络”的用户创建一个专用的php文件?如果是这样的话,我认为你在刨这个计划时做出了错误的决定。include('USERNAME.php')

通常,当您想要根据外部资源共享,控制或更改行为时,您将以JSON数据格式获取数据。

现在,如果我站在你的立场上,我会创建一个REST Web服务,该服务根据用户名get参数返回JSON,并根据传入的数据控制输出。

创建API相当复杂,根据您的需求,您可以使用最适合这些工具的任何工具。我个人喜欢为相当复杂的事情和小事情的流明工作。如果您愿意,也可以自己创建它。

创建api后,您可以使用此处描述的轻松获取JSON,或者使用您可以找到的任何php的休息工具。file_get_contents()


推荐