2013-07-09 2 views
1

У моего сайта WordPress есть портфолио, которое находится в www.mysite.com/portfolio/. Разделы и элементы портфолио администрируются через пользовательский плагин, который я создал. Я хочу получить доступ к отдельным элементам, таким как www.mysite.com/portfolio/my-cool-photo, и добавить «my-cool-photo» в строку запроса, например ?portfolio_item=my-cool-photo, чтобы я мог прочитать ее из моего кода.Добавление пользовательских правил перезаписи в WordPress

В PHP файл активации плагинов у меня есть этот код:

function add_rewrite_rules($wp_rewrite) { 
    $new_rules = array(
     'portfolio/(.+)/?$' => 'index.php?&portfolio_item=$1' 
    ); 

    $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[] = "portfolio_item"; 

    return $public_query_vars; 
} 
add_filter('query_vars', 'query_vars'); 

Это добавляет правило перезаписи в массив OK. Проблема в том, что это ничего не делает. Когда я иду на www.mysite.com/portfolio/testing/, я получаю «Это несколько смущает, не так ли?» Страница ошибки WordPress 404. Очевидно, что редирект не работает, так что строка запроса не будет заполнена, но только, чтобы убедиться, что я сделал это:

global $wp_query, $wp_rewrite; 
if ($wp_rewrite->using_permalinks()) { 
    $searchKey = $wp_query->query_vars['portfolio_item']; 
} else { 
    $searchKey = $_GET['portfolio_item']; 
} 

... и достаточно убедиться, что строка запроса не получает передается.

Есть ли что-то, что мне не хватает?

ответ

3

После обновления WordPress переписать правила, вам необходимо очистить их:

http://codex.wordpress.org/Function_Reference/flush_rewrite_rules

Вы можете смывать с $hard параметром true, а затем вы должны быть в состоянии видеть свои правила перезаписи в файл .htaccess.

+0

В 'add_rewrite_rules' функции я добавил' $ wp_rewrite-> flush_rewrite_rules (истинные), 'в конце. Это ничего не сказалось, и файл htaccess по-прежнему является файлом htaccess по умолчанию WordPress. – Gavin

+1

вы можете попробовать использовать функцию 'add_rewrite_rule': http://codex.wordpress.org/Rewrite_API/add_rewrite_rule – Ygg

+0

Я считаю, что переписывание фактически работает теперь с помощью' add_rewrite_rule'. Проблема в том, что WordPress не распознает mysite.com/portfolio/abcdefg/ как часть/портфолио/страницы, поэтому он дает мне «Это несколько смущает, не так ли?» экран ошибки. Есть ли что-то, что мне нужно сделать, чтобы «сообщить», что он все равно должен загружать страницу портфолио? – Gavin

0

Вот пример переписывания URL-кода. Надеюсь, это поможет пользователям.

В этом URL, как http://www.domainname.com/test-page?urltags=ABCD работает как http://www.domainname.com/test-page/ABCD

<?php 
function add_my_rule() {  
    global $wp; 
    $wp->add_query_var('tags'); 
    add_rewrite_rule('test-page/([^/]*)','index.php?pagename=test-page&urltags=$matches[1]','top'); 
} 
function add_my_tags() { 
    add_rewrite_tag('%urltags%', '([^&]+)'); 
} 
add_action('init', 'add_my_rule'); 
add_action('init', 'add_my_tags', 10, 0); 
?> 
Смежные вопросы