Поддержка Проблемы и решения Помогите с rewrite_rule

  • Сделал старницу вида site.ru/foto/1/

    Пытаюсь сделать с помощью add_rewrite_rule чтобы страница отображалась, а не 404 при открытии. Вот что пытаюсь сделать.

    function fotoRewrite(){
    	global $wp_rewrite;
    	add_rewrite_rule('foto/(.*)/$', 'index.php?attachment_id=$matches[1]', 'top');
    }
    
    add_filter('init', 'fotoRewrite');

    Но видимо это вовсе не так должно быть. Может кто-то объяснить как добавить свое правило или переопределить уже имеющееся правило. Нагуглил несколько обсуждений на эту тему, но пока не получается понять точно как это делается.

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    function fotoRewrite($rules) {
    	$newrules = array();
    	$newrules['foto/(\d*)$'] = 'index.php?attachment_id=$matches[1]';
    	return $newrules + $rules;
    }
    add_filter('rewrite_rules_array', 'fotoRewrite');
    
    function flushRules() {
    	global $wp_rewrite;
       	$wp_rewrite->flush_rules();
    }
    add_action('init', 'flushRules');

    Функция flushRules() нужна только один раз — после первого запуска лучше её убрать для снижения нагрузки. Можно и не добавлять её, а пересохранить настройки постоянных ссылок.

    О класс!

    Если пересохранять настройки постоянных ссылок, то сначала записывать текущие настройки, затем перед вызовом функции, которая возвращает код ссылки менять на свое значение и после возвращать назад?

    Что-то такое я встречал на форумах, когда гуглил, но решил, что раз есть add_rewrite_rule, то есть более элегантное решение.

    Спасибо!

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Я просто добавил fotoRewrite() в functions.php, затем зашёл в настройки постоянных ссылок и нажал кнопку «Сохранить изменения».

    мммм… Т.е. в таком случае это правило в БД будет сохранено со всем множеством правил и вызывать $wp_rewrite->flush_rules() не придется каждый раз?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Да, верно. Цитата из Кодекса:

    Keep in mind that the flush_rules function is quite slow, so in practice you never want to call it from the init filter that gets executed on each page load. Instead, call this function only when the rewrite rules change.

    Ок )

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • Тема «Помогите с rewrite_rule» закрыта для новых ответов.