Создание правила перезаписи 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 и т. д.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *