#php #wordpress #url-rewriting #buddypress
#php #wordpress #url-переписывание #buddypress
Вопрос:
У меня есть существующая ссылка на профиль пользователя buddy press: напримерhttps://example.com/members/joseph-bada
Мне нужно сделать https://example.com/members/joseph-b точная копия этого.
это упрощенная версия моего кода:
add_filter('wp', 'custom_rewrite_rule');
function custom_rewrite_rule() {
global $wp_query, $wp_rewrite;
$slug = $wp_query->query_vars['name'];
if($slug==='joseph-bada') {
add_rewrite_rule('^members/joseph-b/?', 'members/joseph-bada', 'top');
$wp_rewrite->flush_rules();
}
}
но если я просмотрю https://example.com/members/joseph-b — я получаю ошибку 404
ОБНОВЛЕНИЕ: даже после добавления этого в functions.php
add_action('init', 'custom_test');
function custom_test() {
global $wp_rewrite;
add_rewrite_rule('^members/joseph-b', 'members/joseph-bada', 'top');
$wp_rewrite->flush_rules();
}
https://example.com/members/joseph-b по-прежнему 404
может кто-нибудь, пожалуйста, указать, чего мне не хватает?
ОБНОВЛЕНИЕ: я узнал, чтоhttps://example.com/index.php?bbp_user=joseph-badaamp;edit=1 приводит к https://example.com/members/joseph-bada
итак, теперь я попробовал это:
add_action('init', 'custom_test');
function custom_test() {
global $wp_rewrite;
add_rewrite_rule('^members/joseph-b', 'https://example.com/index.php?bbp_user=joseph-badaamp;edit=1', 'top');
$wp_rewrite->flush_rules();
}
все еще безрезультатно 404..
Ответ №1:
Отказ от ответственности: Я не разработчик WP, но вот что получается.
Похоже, что часть $query в add_rewrite_rule должна быть явной в его настройке (как показано в примере ниже с index.php строка).
function custom_rewrite_rule() {
add_rewrite_rule('^nutrition/?([^/]*)/?','index.php?page_id=12amp;food=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);
Я также заметил, что вы выполняете add_filter в отличие от add_action.
Ответ №2:
я отказался от использования функциональности add_rewrite_rule WordPress.. вместо этого я изучил плагин buddypress и то, как он работает.. я обнаружил следующие фильтры:
function custom_bp_domain_filter($domain, $user_id) {
$change_slug = is_joseph_bada_user_id($user_id);
if ($change_slug) {
$domain = trailingslashit(bp_get_root_domain() . '/' . 'members/joseph-b');
}
return $domain;
}
add_filter('bp_core_get_user_domain', 'custom_bp_domain_filter', 10, 2);
эта часть выше представляет собой фильтр, в котором я собираюсь проверить, принадлежит ли отображаемый идентификатор пользователя members / joseph-bada. если это так, измените его на члены /джозеф-б
function custom_bp_after_slug_filter($after_member_slug) {
if ($after_member_slug==='joseph-b') {
$after_member_slug = 'joseph-bada';
}
return $after_member_slug;
}
add_filter('bp_core_set_uri_globals_member_slug', 'custom_bp_after_slug_filter');
эта приведенная выше часть определяет, является ли URI теперь members / joseph-b .. у нас нет пользователя с этим, вместо этого это ‘joseph-bada’
возвращаемое значение здесь — это отображаемый пользователь, поэтому нам нужно вернуть ‘joseph-bada’, если значение параметра равно ‘joseph-b’
при просмотре members/joseph-b .. отобразится профиль members/joseph-bada