Нужна помощь с правилом добавления перезаписи


РЕШЕНИЕ


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


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

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

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

  1. Как мне использовать add_rewrite_rule()?
  2. Мне нужно передать идентификатор дизайнера (заявку). Как я могу это сделать при использовании правил 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

Вот еще одно решение, которое я пробовал, которое Ян Фабри предлагает в другом потоке. Я положил это в свой functions.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
Я также нашел здесь несколько примеров. Но это тоже не работает:(

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;
}

Я был бы очень признателен, если бы кто-нибудь смог помочь мне решить эту проблему.

Author: Steven, 2010-12-15

1 answers

Некоторые сведения о правилах перезаписи

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

Эти правила перезаписи сохраняются в базе данных путем вызова flush_rewrite_rules(), но поскольку создание и запись этих правил является дорогостоящей операцией, вы не должны делать это на каждом init. Вместо этого вы делаете это только при изменении правил: возможно, при активации плагина (с помощью register_activation_hook()) или вручную, посетив страницу настроек Постоянные ссылки ( потому что это трудно сделать автоматически при активации темы). Если вы не очистите правила, вызов 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 с цифровым идентификатором (bid) 9. Вам не нужен этот идентификатор в URL-адресе, а только имя. Мы называем удобную для URL версию имени (без пробелов или специальных символов) слизняком: Batlak-og-Selvig.

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

Итак, что мы узнали сейчас, так это то, что мы хотим добавить правило перезаписи для шаблона "/designers/ за этим следует все, что угодно, вплоть до следующего /", и сохраните это "что угодно" в переменной запроса designer_slug. В вашем случае, я полагаю, вы также хотите использовать страницу со слизняком 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, чтобы он также сохранял designer_slug в переменных запроса, чтобы вы могли получить к нему доступ позже. WordPress использует белый список разрешенных переменных запроса, чтобы люди не могли изменять каждый параметр запроса сообщений по URL-адресу. Все, что не входит в этот список, игнорируется. Просто зацепитесь за крючок 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, потому что функция add_rewrite_rule(), похоже, не работала для него.

 90
Author: Jan Fabry, 2017-04-13 12:37:50