Я занимаюсь этим уже несколько дней, просматривая здесь множество ответов, руководств по использованию.htaccess, руководств по использованию add_rewrite_rule() в WordPress и примеров в Интернете. Я не уверен, есть ли неисправность в моем регулярном выражении для определения правильного URL-адреса или разрыв между тем, что я хочу выполнить, и тем, что может быть выполнено.
По сути, я пытаюсь отделить комментарии от сообщений (или, что еще лучше, комментарии от контента), заставляя их размещаться на отдельной странице, «связанной» с контентом. Так, например, http://localhost/wp/2011/02/25/hello-world-2/
это сообщение, и комментарии к этому сообщению должны отображаться по адресу http://localhost/wp/2011/02/25/hello-world-2/comments/
. Так вот, «маленькая птичка» однажды сказала, что это можно сделать следующим образом:
RewriteRule ^archives/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)/comments/?$ /index.php?year=$1&monthnum=$2&day=$3&name=$4&comments=1 [QSA,L]
(поскольку мне не нужно работать внутри /archives/, чтобы мой вышеприведенный пример работал, я удалил его), который я перевел в этот плагин:
<?php
/*
Plugin Name: Gingah Permalink Rewrite
Plugin URI: http://gingahmail.com/wordpress/
Description: Useful Permalink-structures, that required a plugin to work.
Version: 1.0
Author: Gingah
Author URI: http://gingahmail.com/
*/
register_activation_hook( __FILE__, 'gingah_rewrite_activate' );
function gingah_rewrite_activate() {
gingah_rewrite();
flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'gingah_rewrite_deactivate' );
function gingah_rewrite_deactivate() {
flush_rewrite_rules();
}
add_action('admin_init', 'gingah_rewrite');
function gingah_rewrite() {
add_rewrite_rule( '^([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)/comments/?$', '/index.php?year=$1&monthnum=$2&day=$3&name=$4&comments=1 [QSA,L]', 'top' );
}
?>
(на основе бесчисленных подобных примеров в Интернете)
Однако это не работает. Хотя посещение http://localhost/wp/2011/02/25/hello-world-2/?comments=1
дает ожидаемый результат. Так что здесь происходит не так?
Правила перезаписи WordPress по умолчанию больше не хранятся в конфигурации Apache, а обрабатываются самим WordPress. Этого, вероятно, не было, когда писалась та тема на форуме (5 лет назад), но в настоящее время в конфигурацию Apache попадают только «внешние» правила, все остальные хранятся в базе данных и обрабатываются
WP::parse_request()
функцией.add_rewrite_rule()
Это означает, что вы должны исключить из своего вызова те части, которые относятся к Apache. Следующий код выглядит лучше:Когда я тестировал это с помощью моего плагина анализатора перезаписи, я заметил, что
comments
это не стандартная переменная запроса, так что помните, что вам тоже придется обрабатывать это.По крайней мере, теперь это показывает сам пост. Я попытался добавить предложенное в
http://wordpress.stackexchange.com/questions/3537/need-help-with-friendly-urls-in-wordpress/3575#3575
(заменив имя дизайнера комментариями, чтобы исправить переменную запроса, как вы предлагаете, ноhttp://localhost/wp/2011/02/25/hello-world-2/comments/
все равно показывает только сообщение.@Gingah: Но если вы можете установить эту дополнительную переменную запроса, вы также можете подключиться
template_include
, чтобы выбрать конкретный файл темы, который будет отображать только комментарии, а не сообщения.Думаю, это сработает, но позволит
http://localhost/wp/2011/02/25/hello-world-2/comments/
ли это показывать комментарии?@Gingah: Да, вы можете думать об этом как о двух разных файлах тем, основанных на одном и том же
single.php
: один показывает пост, но без комментариев, а другой показывает комментарии, но не пост. Вы даже можете сделать это в одномsingle.php
, если вы прочитаете переменную запроса там.Я добавил функциональность в
single.php
-file. Итак, когда запись просматривается, комментарии скрыты, но если на страницу передается GET-переменная с именем comments (и равна 1), отображаются только комментарии. Это правильный путь? Я до сих пор не могу/comments/
показать только комментарии (используяif (isset($_GET['comments']) && $_GET['comments'] == 1)
, чтобы проверить, установлена ли переменная- комментарии ).