Создание правила перезаписи WordPress, которое указывает на файл на сервере и отправляет переменные
Вы когда-нибудь пытались переписать URL-адрес WordPress, чтобы он указывал на файл на сервере?
Сначала я пытался сделать это:
// Add Custom Rewrite Rules
function custom_rewrite_basic() {
flush_rewrite_rules();
add_rewrite_rule('^leaf/([0-9]+)/?', 'wp-content/plugins/my-plugin/index.php?leaf=$matches[1]', 'top');
}
add_action('init', 'custom_rewrite_basic');
но мне пришлось узнать, что WordPress поддерживает добавление правила перезаписи, которое не указывает на index.php
Поэтому я пошел на метод .htaccess:
RewriteRule ^index\.php$ - [L]
RewriteRule ^leaf/([0-9]+)/? /wp-content/plugins/my-plugin/index.php?leaf=$1 [QSA,L]
но это не сработало так, как я ожидал. Это просто не перенаправляло на мой файл. Подумайте об этом сейчас, я не помню, вставил ли я его в начало файла .htaccess, чтобы его можно было прочитать первым, но если вы попробуете, не забудь поставить вверху.
Поэтому я пошел за parse_request крючок, который оказался отличным способом сделать это.
Я вставил это в свою дочернюю тему, и все получилось:
add_action( 'parse_request', function( $wp ){
// The regex can be changed depending on your needs
if ( preg_match( '#^leaf/(.*)/?#', $wp->request, $matches ) ) {
// Get the Leaf Number
$leaf = $matches[1];
// Define it for my-plugin's index.php
$_GET['leaf'] = urldecode($leaf);
// Load your file - make sure the path is correct.
include_once WP_CONTENT_DIR . '/plugins/my-plugin/index.php';
exit; // and exit
}
});
Обратите внимание, что для того, чтобы быть Безопасно при сборе и обработке переменной GET вам может потребоваться применить к ней некоторую очистку. Пример: mysql_real_escape_string, htmlspecialchars, strip_tags, stripslashes, preg_quote, escapeshellarg, escapeshellcmd и т. д.