РЕШЕНИЕ
Я пошел с обновлением 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-og-Selvig /
- Как я могу использовать
add_rewrite_rule()
? - Мне нужно передать ID дизайнера (ставку). Как я могу сделать это при использовании правил 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;
}
Я был бы очень признателен, если бы кто-нибудь смог помочь мне решить эту проблему.
bid
?slug
? `Получить данные Designer гораздо прощеbid
, чем использоватьdesigner
Ответы:
Некоторый фон на правилах переписывания
Система WP Rewrite выглядит сложной, но на самом деле не так сложно понять, как она работает. Он используется для разбора симпатичных 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 должен содержать всю информацию, чтобы идентифицировать контент, который вы хотите показать на странице. Вы можете использовать куки или POST-запросы для хранения фактического идентификатора дизайнера, который вы хотите отобразить, но он сломается, если кто-то поделится ссылкой, отправив ее по почте, Facebook, Twitter или просто прочитав ее вслух по телефону. Если вы не хотите использовать числовой идентификатор в своем URL-адресе, убедитесь, что слаг является уникальным: затем сначала выполните поиск идентификатора на основе слага и продолжите, как вы делали раньше.
Итак, что мы узнали сейчас, так это то, что мы хотим добавить правило перезаписи для шаблона «
/designers/
после чего-нибудь до следующего/
» и сохранить это «что-нибудь» вdesigner_slug
переменной запроса. В вашем случае я считаю, что вы также хотите использовать страницу со слагомdesigners
в качестве общего содержимого страницы, поэтому мы расскажем об этом и WordPress.Осталось только сказать, чтобы WordPress также оставил
designer_slug
переменные в запросе, чтобы вы могли получить к ним доступ позже. WordPress использует белый список разрешенных переменных запроса, чтобы люди не могли изменять каждый параметр запроса сообщений через URL. Все, что не в этом списке, игнорируется. Просто подключитесьquery_vars
и добавьте свою дополнительную переменную:Как видите, этот ответ в основном совпадает с моим предыдущим ответом , но без очистки правила в коде (так что вы можете использовать его в своей теме
functions.php
вместо плагина), и с большей уверенностью и объяснением, потому что я выучил много о правилах переписывания с тех пор (и из-за) ответа на ваш первый вопрос.Обсуждение чата
Мы выяснили последние вопросы по этому вопросу в чате . В конце концов, Стивен использовал
generate_rewrite_rules
зацепку, потому что этаadd_rewrite_rule()
функция, похоже, не работала на него.источник
pagename
страницы WordPress, которую вы хотите отобразить (запись в базе данных). Затем эта страница может указать, что она хочет использоватьdesigners.php
файл шаблона в административной области WP. Таким образом, вы указываете на слаг страницы, а не на имя шаблона, поскольку один и тот же шаблон может использоваться для нескольких страниц: в этом случае WordPress не знает, что вы хотите сделать.add_rewrite_rules()
функцию и вызватьadd_filter()/add_action()
напрямую. Если это в файле темы, удалитеflush_rewrite_rules()
и просто перейдите на страницу настроек постоянных ссылок, чтобы очистить правила (или добавьте ихwpse5413_init()
и удалите их позже). И мой плагин отображает текущие правила перезаписи. Помните, что это только меняет способ обработки входящих URL-адресов, а не то, как ваш код будет записывать URL-адреса в HTML./designers/designer-slug/
URL-адреса, вам нужно изменить места, где вы пишете эти URL-адреса в своем HTML-коде. Проверьте это, перейдя к/designers/Batlak-og-Selvig/
себе, если это работает, найдите все места, которые генерируют эти URL-адреса, и измените их, чтобы использовать новую структуру.www.mysite.com/batlat-og-selvig/9
а затем его «перевести» на/?designer=Batlak-og-Selvig&bid=9