banesto
  • 0
Новичок

Пользовательское правило перезаписи типа записи для автора и пейджинга?

  • 0

Я использую WordPress 3.0.1 и создал пользовательский тип записи с именем 'dienasgramatas' . Мой плагин также создает настраиваемые правила перезаписи для отображения всех сообщений из этого типа сообщений и даже пользовательскую структуру постоянных ссылок для запроса сообщений с этим типом сообщений от определенного автора, но я не могу создать правило для разбиения на страницы:

Это тот, который работает:

$new_rules['dienasgramatas' . '/([^/]+)/?$'] = 
  'index.php?post_type=dienasgramata&author_name=' . $wp_rewrite->preg_index(1);

Это дает это правило перезаписи:

[dienasgramatas/([^/]+)/?$] => index.php?post_type=dienasgramata&author_name=$matches[1]

Но этот:

$new_rules['dienasgramatas' . '/([^/]+)/page/?([0-9]{1,})/?$'] = 
  'index.php?post_type=dienasgramata&author_name=' . $wp_rewrite->preg_index(1). 
  '&paged=' . $wp_rewrite->preg_index(2);

Выводит это (ошибочное) правило перезаписи:

[dienasgramatas/([^/]+)/page/?([0-9]{1,})/?$] => 
  index.php?dienasgramata=$matches[1]&paged=$matches[2]

Как видите, post_type оно игнорируется и это правило перезаписи не работает должным образом.

Может кто-нибудь сказать мне, почему это не работает или как сделать это правильно?

фильтр для функции:

add_filter('generate_rewrite_rules', 'add_rewrite_rules');

Полная функция выглядит следующим образом:

function add_rewrite_rules($wp_rewrite) {

$new_rules['dienasgramatas' . '/([^/]+)/?$'] = 'index.php?post_type=dienasgramata&author_name=' . $wp_rewrite->preg_index(1);
$new_rules['dienasgramatas' . '/([^/]+)/page/?([0-9]{1,})/?$'] = 'index.php?author_name=' . $wp_rewrite->preg_index(1) . '&paged=' . $wp_rewrite->preg_index(2) . '&post_type=dienasgramata';

$wp_rewrite->rules = array_merge($new_rules, $wp_rewrite->rules);
return $wp_rewrite;

}

Основная потребность в том, что я хочу пойти в

www.example.com/dienasgramatas/admin/page/2

и получать сообщения от ‘admin’ с post_type = ‘dienasgramata’ и второй страницей (например, смещение 10 сообщений). Правило перезаписи без page/2 работает нормально. Может быть, это проблема с регулярным выражением, или проблема с переменными запросов, или с тем, как назначаются правила перезаписи.

Пример живого сайта: http://dev.fiicha.lv/jb/dienasgramatas/juris/ — работает нормально http://dev.fiicha.lv/jb/dienasgramatas/juris/page/2/ — не работает

внизу все правила перезаписи и переменные запроса

Share
  1. @banesto — мне нужно больше контекста, чтобы ответить на ваши вопросы. Какие крючки используете? Вы используете функцию add_rewrite_rule() ? Если вы можете опубликовать полный пример, вам будет легче помочь.

    • 0
  2. Привет @banesto :

    Я думаю, что простой ответ может заключаться в том, что вам нужно, чтобы ваш URL-адрес страницы был указан перед более коротким URL-адресом, но, поскольку я не проверял его, я не уверен на 100%.

    Тем не менее, у меня всегда было много проблем с 'generate_rewrite_rules' крючком. Я уверен, что лучший разработчик, чем я, мог бы заставить его работать, но для меня было намного чище использовать эту add_rewrite_rule() функцию, поэтому я показываю, как вы должны настроить маршрут URL-адресов.

    Вот плагин, который делает то, что вы просили ( register_post_type() вызов только для того, чтобы этот плагин работал в моей тестовой установке WordPress; вы можете заменить его своим):

    <?php
    /*
    Plugin Name: Dienasgramatas Urls
    Version: 1.0
    Author: Mike Schinkel
    Author URI: http://mikeschinkel.com/
    */
    
    if (!class_exists('Dienasgramatas_Urls')) {
      class Dienasgramatas_Urls {
        static function init() {
          $post_type = 'dienasgramatas' ;
          register_post_type($post_type,
            array(
              'label'           => 'Dienasgramatas',
              'public'          => true,
              'show_ui'         => true,
              'query_var'       => 'dienasgramatas',
              'rewrite'         => array('slug' => 'dienasgramatas'),
              'hierarchical'    => false,
              'supports'        => array('title','editor','custom-fields'),
            )
          );
    
          add_rewrite_rule("{$post_type}/([^/]+)/page/?([2-9][0-9]*)",
            "index.php?post_type={$post_type}&author_name=\$matches[1]&paged=\$matches[2]", 'top');
    
          add_rewrite_rule("{$post_type}/([^/]+)",
            "index.php?post_type={$post_type}&author_name=\$matches[1]", 'top');
    
        }
        static function on_load() {
          add_action('init',array(__CLASS__,'init'));
        }
        static function register_activation_hook() {
          self::init();
          flush_rewrite_rules(false); 
        }
      }
      Dienasgramatas_Urls::on_load();
    }
    

    Конечно, всякий раз, когда вы добавляете правила перезаписи, вам нужно сбрасывать правила перезаписи, иначе они просто не будут работать. В идеале вы не хотите сбрасывать правила для каждой загрузки страницы, поэтому стандартный способ сделать это — использовать хук активации плагина. Поэтому я создал плагин для вас, но не стесняйтесь просто использовать add_rewrite_rule() вызовы в functions.php файле вашей темы и вручную сбрасывать ваши URL-адреса, нажав «Сохранить изменения» в разделе «Настройки> Постоянные ссылки» консоли администратора.

    • 0

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

You must login to add an answer.