Нужна помощь с add_rewrite_rule

РЕШЕНИЕ


Я пошел с Update 3 и получил его работу. То, что я неправильно понял, состояло в том, что я полагал, что правило перезаписи изменит конструкторы designers/?designer=some-designer&bid=9 на /designers/some-designer. Но это, конечно, наоборот.


Я занимался некоторыми исследованиями, но я не совсем понимаю, как использовать add_rewrite_rule () .

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

Моя текущая ссылка: http: //www.norwegianfashion.no/designers/?designer=Batlak-og-Selvig&bid=9
Я хочу, чтобы это было http://www.norwegianfashion.no/designers/Batlak-ог-Сельвиг /

  1. Как использовать add_rewrite_rule()?
  2. Мне нужно пройти идентификатор дизайнера (bid). Как это сделать при использовании правил re.write без указания URL-адреса?

Обновление 1

Я нашел это , который является бит более объяснительный. Но он не работает:

function add_rewrite_rules( $wp_rewrite ) 
{
    $new_rules = array(
        '('.$template_page_name.')/designers/(.*?)/?([0-9]{1,})/?$' => 'designers.php?designer='.
        $wp_rewrite->preg_index(1).'&bid='.
        $wp_rewrite->preg_index(2)
    );
       // Always add your rules to the top, to make sure your rules have priority
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'add_rewrite_rules');

function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}
add_filter('query_vars', 'query_vars')

Обновление 2

Вот еще одно решение, которое я пробовал: Ян Фабри предлагает в другой теме. Я поместил это в мои функции.php, но это не имеет никакого эффекта.

add_action('generate_rewrite_rules', 'add_rewrite_rules');
add_filter('query_vars', 'query_vars');

/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function add_rewrite_rules( $wp_rewrite ) 
{
    add_rewrite_rule('^designers/([^/]*)/([^/]*)$ /designers/?designer=$1&bid=$2 [L]', 'top');
    flush_rewrite_rules(false);
}


function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}

Обновление 3
I нашел несколько примеров здесь . Но это тоже не работает: (

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');  

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(designers)/(\d*)$'] = 'index.php?pagename=designers&designer=$matches[1]';
    return $newrules + $rules;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'designer');
    return $vars;
}

Обновление 4 Я также пробовал это решение, но до сих пор не удалось.

add_filter('search_rewrite_rules', 'designers_createRewriteRules');

function designers_createRewriteRules($rewrite) {
global $wp_rewrite;

// add rewrite tokens
$designer_token = '%designers%';
$wp_rewrite->add_rewrite_tag($designer_token, '(.+)', 'designers=');

$bid_token = '%bid%';
$wp_rewrite->add_rewrite_tag($bid_token, '(.+)', 'bid=');

$keywords_structure = $wp_rewrite->root . "designers/$designer_token/$bid_token";
$keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure);

return ( $rewrite + $keywords_rewrite );

}

Обновление 5
Кажется, что мои правила перезаписи не добавлены. Выполнение следующих изменений новых правил: print_r($wp_rewrite), не включает в себя мои новые правила перезаписи.

Обновление 6
Я протестировал решение Яна. Но URL-адрес не изменяется: (

/* Initiation script for NF template
------------------------------------------------------------------------------*/   
add_action('after_setup_theme','norwegianfashion_setup');

if ( ! function_exists( 'norwegianfashion_setup' ) ):

  function norwegianfashion_setup() { 
    /* Here I do a lot of stuff */

    // SEO friendly URL for desigenrs
    add_action( 'init', 'wpa5413_init' );
    add_filter( 'query_vars', 'wpa5413_query_vars' );
  }

endif;


/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        'designers/([^/]+)/?',
        'index.php?pagename=designers&designer=$matches[1]',
        'top' );
}

function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer';
    return $query_vars;
}

Я бы действительно оценил это, если бы кто-то помог мне решить эту проблему.

51 голос | спросил 18 revs, 3 users 60%
Steven
1 Jam1000000amThu, 01 Jan 1970 03:00:00 +030070 1970, 03:00:00

1 ответ


84

Некоторый фон правил перезаписи

Система WP Rewrite выглядит сложной, но на самом деле не так сложно понять, как она работает. Он используется для синтаксического анализа симпатичных URL-адресов (/designers/), как если бы они были некрасивыми (/index.php?pagename=designers) , Основная идея заключается в том, что у вас есть список правил rewrite , регулярных выражений, которые могут соответствовать входящим URL-адресам, и переписывать их на другие URL-адреса, в основном в форме index.php с некоторыми переменными запроса. Эти переменные устанавливаются в части регулярного выражения, которое соответствует URL-адресу. Правила оцениваются сверху вниз, поэтому, если два правила могут совпадать, первый «выигрывает».

Эти правила перезаписи хранятся в базе данных, вызывая flush_rewrite_rules(), но поскольку генерация и запись этих правил является дорогостоящей операцией, вы не должны делать это на каждом init. Вместо этого вы делаете это только при изменении правил: возможно, при активации плагина (используя register_activation_hook()) или вручную, посетив страницу настроек Permalinks ( потому что это трудно сделать автоматически при активации темы ). Если вы не очищаете правила, вызов add_rewrite_rule() не влияет. Не стоит вызывать add_rewrite_rule() на каждом init, даже после того, как вы сбросили правила.

Существует много способов добавить свои правила перезаписи, и если вы хотите добавить только одно правило, вы можете сделать это с помощью add_rewrite_rule(). Поскольку правила для сообщений, страниц, таксономии ... приводят к нескольким правилам, они создаются с такими высокоуровневыми функциями, как add_rewrite_tag(), add_permastruct(), .. , Но они не нужны для простого случая, который мы имеем здесь.

Также есть несколько фильтров, поэтому вы также можете добавить свои правила, используя крючки generate_rewrite_rules или generate_rewrite_rules_array. Это дает вам очень подробный контроль над полными правилами, но опять же, add_rewrite_rule() достаточно, если вы просто хотите добавить одно правило.

Я создал небольшой плагин, который позволяет анализировать текущие правила перезаписи и (конечно) я рекомендую вам использовать его, когда вы пытаетесь что-то изменить.

Получение дополнительной информации из URL

Давайте опишем пример, который вы дали. У вас есть дизайнерский бренд Batlak og Selvig, с идентификатором numberic (bid) 9. Вам не нужен этот идентификатор в URL-адресе, а только имя. Мы называем URL-friendly версию имени (без пробелов или специальных символов) slug : Batlak-ог-Сельвиг.

В общем, URL-адрес должен содержать всю информацию для идентификации содержимого, которое вы хотите показать на странице. Вы можете использовать файлы cookie или POST-запросы для хранения фактического идентификатора дизайнера, который вы хотите отобразить, но это сломается, если кто-то поделится ссылкой, отправив ее по почте, Facebook, Twitter или просто прочитав ее вслух по телефону. Если вы не хотите использовать числовой идентификатор в своем URL-адресе, вы должны убедиться, что пул уникален: сначала вы просматриваете идентификатор на основе пули и продолжаете, как и раньше.

Итак, теперь мы узнали, что мы хотим добавить правило перезаписи для шаблона "Batlak-og-Selvig, за которым следует что-либо до следующего /designers/ " и сохраните " anything " в переменной запроса /. В вашем случае я считаю, что вы также хотите использовать страницу с дизайнером designer_slug в качестве общего содержимого страницы, поэтому мы также расскажем о WordPress.

designers

Осталось только сказать, что WordPress также сохраняет add_action( 'init', 'wpa5413_init' ); function wpa5413_init() { // Remember to flush the rules once manually after you added this code! add_rewrite_rule( // The regex to match the incoming URL 'designers/([^/]+)/?', // The resulting internal URL: `index.php` because we still use WordPress // `pagename` because we use this WordPress page // `designer_slug` because we assign the first captured regex part to this variable 'index.php?pagename=designers&designer_slug=$matches[1]', // This is a rather specific URL, so we add it to the top of the list // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win" 'top' ); } в переменных запроса, поэтому вы можете получить к нему доступ позже. WordPress использует белый список разрешенных переменных запроса, чтобы люди не изменяли каждый параметр запроса сообщений через URL. Все, что не в этом списке, игнорируется. Просто зацепитеdesigner_slug и добавьте дополнительную переменную:

query_vars

Как вы можете видеть, этот ответ в основном такой же, как мой предыдущий ответ , но без правила, очищающего код (так что вы можете использовать его в add_filter( 'query_vars', 'wpa5413_query_vars' ); function wpa5413_query_vars( $query_vars ) { $query_vars[] = 'designer_slug'; return $query_vars; } вашей темы вместо плагина) и с немного большей уверенностью и объяснением, потому что я много узнали о правилах перезаписи с (и из-за) ответа на ваш первый вопрос.

Обсуждение в чате

Мы выяснили последние вопросы по этому вопросу в чате . В конце концов, Стивен использовал крючок functions.php, потому что функция generate_rewrite_rules, похоже, не работала для него.

ответил Jan Fabry 16 ThuEurope/Moscow2010-12-16T13:07:23+03:00Europe/Moscow12bEurope/MoscowThu, 16 Dec 2010 13:07:23 +0300 2010, 13:07:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132