olevik
  • 0
Новичок

Отдельная страница для комментариев с использованием постоянных ссылок и add_rewrite_rule

  • 0

Я занимаюсь этим уже несколько дней, просматривая здесь множество ответов, руководств по использованию.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 дает ожидаемый результат. Так что здесь происходит не так?

Share
  1. Правила перезаписи WordPress по умолчанию больше не хранятся в конфигурации Apache, а обрабатываются самим WordPress. Этого, вероятно, не было, когда писалась та тема на форуме (5 лет назад), но в настоящее время в конфигурацию Apache попадают только «внешние» правила, все остальные хранятся в базе данных и обрабатываются WP::parse_request() функцией.

    add_rewrite_rule() Это означает, что вы должны исключить из своего вызова те части, которые относятся к Apache. Следующий код выглядит лучше:

    add_rewrite_rule(
        // The beginning `^` is added by WordPress
        '([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)/comments/?$',
        // `$1` should be replaced with `$matches[1]`
        'index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&name=$matches[4]&comments=1',
        'top'
    );
    

    Когда я тестировал это с помощью моего плагина анализатора перезаписи, я заметил, что comments это не стандартная переменная запроса, так что помните, что вам тоже придется обрабатывать это.

    • 0
    • По крайней мере, теперь это показывает сам пост. Я попытался добавить предложенное в 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/ все равно показывает только сообщение.

      • 0
    • @Gingah: Но если вы можете установить эту дополнительную переменную запроса, вы также можете подключиться template_include, чтобы выбрать конкретный файл темы, который будет отображать только комментарии, а не сообщения.

      • 0
    • Думаю, это сработает, но позволит http://localhost/wp/2011/02/25/hello-world-2/comments/ ли это показывать комментарии?

      • 0
    • @Gingah: Да, вы можете думать об этом как о двух разных файлах тем, основанных на одном и том же single.php : один показывает пост, но без комментариев, а другой показывает комментарии, но не пост. Вы даже можете сделать это в одном single.php, если вы прочитаете переменную запроса там.

      • 0
    • Я добавил функциональность в single.php -file. Итак, когда запись просматривается, комментарии скрыты, но если на страницу передается GET-переменная с именем comments (и равна 1), отображаются только комментарии. Это правильный путь? Я до сих пор не могу /comments/ показать только комментарии (используя if (isset($_GET['comments']) && $_GET['comments'] == 1), чтобы проверить, установлена ​​ли переменная- комментарии ).

      • 0

Оставить ответ

You must login to add an answer.