Как создать внешний пользовательский профиль с дружественной постоянной ссылкой

23

Я хочу создать общедоступную страницу профиля переднего плана с дружественным URL-адресом, подобным этому формату.

mysite.com/user/someusername

Любая идея о том, как я могу добиться этого? Я знаю, что это как-то связано с правилом перезаписи, но я понятия не имею, как я могу это сделать. Если у вас есть ссылка или учебник для меня, это будет здорово.

Благодарность!

tiltdown
источник

Ответы:

15

Есть два способа сделать это:

  1. Страница автора с пользовательским правилом перезаписи
  2. Файлы пользовательских шаблонов в сочетании с правилом перезаписи

Первый способ более прост в реализации, но может работать не во всех обстоятельствах (один из которых я опишу в ближайшее время).

Пользовательское правило перезаписи

Я нашел это решение несколько дней назад здесь: перезапись URL

А вот код с комментариями:

// Define the author levels you want to use
$custom_author_levels = array( 'user', 'leader' );

// On init, add a new author_level rewrite tag and add it to the author_base property of wp_rewrite
add_action( 'init', 'wpleet_init' );
function wpleet_init()
{
    global $wp_rewrite;
    $author_levels = $GLOBALS['custom_author_levels'];

    // Define the tag and use it in the rewrite rule
    add_rewrite_tag( '%author_level%', '(' . implode( '|', $author_levels ) . ')' );
    $wp_rewrite->author_base = '%author_level%';

}

// The previous function creates extra author_name rewrite rules that are unnecessary.  
//This function tests for and removes them

add_filter( 'author_rewrite_rules', 'wpleet_author_rewrite_rules' );
function wpleet_author_rewrite_rules( $author_rewrite_rules )
{
    foreach ( $author_rewrite_rules as $pattern => $substitution ) {
        if ( FALSE === strpos( $substitution, 'author_name' ) ) {
            unset( $author_rewrite_rules[$pattern] );
        }
    }
    return $author_rewrite_rules;
}

Затем вы можете использовать встроенный шаблон author.php, модифицируя содержимое вашего сердца.

С уважением, проверьте ссылку, указанную выше, так как Ян Фабри отлично объясняет все.

Варианты запросов и шаблоны страниц

Для темы, над которой я работал, находя эти решения, мне нужно было обслуживать пользовательскую страницу, основанную на мета-значении пользователя (отдельном идентификаторе). Мой клиент не хотел, чтобы имя пользователя или идентификатор пользователя были видны публично, поэтому мы создали отдельный слой.

Единственная проблема? На данный момент нет четкого способа использования API Rewrite для запроса по мета-ключам / значениям. К счастью, было решение.

В вашем файле functions.php ...

// Create the query var so that WP catches your custom /user/username url
add_filter( 'query_vars', 'wpleet_rewrite_add_var' );
function wpleet_rewrite_add_var( $vars )
{
    $vars[] = 'user';
    return $vars;
}

И затем вам нужно создать новый тег и правило перезаписи, чтобы он знал, когда и как обрабатывать новый запрос var.

add_rewrite_tag( '%user%', '([^&]+)' );
add_rewrite_rule(
    '^user/([^/]*)/?',
    'index.php?user=$matches[1]',
    'top'
);

После того, как вы это сделали, вам просто нужно «поймать», когда обрабатывается запрос var, и затем перенаправить на выбранный вами шаблон:

add_action( 'template_redirect', 'wpleet_rewrite_catch' );
function wpleet_rewrite_catch()
{
    global $wp_query;

    if ( array_key_exists( 'user', $wp_query->query_vars ) ) {
        include (TEMPLATEPATH . '/user-profile.php');
        exit;
    }
}

Просто убедитесь, что вы создали user-profile.php.

В моем собственном примере я создал третью функцию, которая сопоставляла «общедоступный идентификатор пользователя» с фактическим user_id через таблицу $ wpdb-> usermeta, и передавала информацию в шаблон.

Если вам нужно создать шаблон, отличный от остальной вашей темы, помните, что с помощью get_header вы можете указать имя:

get_header( 'user' );

Который будет вызывать файл header-user.php.

Вывод

Оба из них являются действующими, работающими решениями. Второй предлагает отдельный уровень «безопасности», так как он не раскрывает идентификаторы или имена пользователей, если другие люди смогут просматривать профили.

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

bybloggers
источник
Я на самом деле решил это с помощью метода Query_var. Благодарность!
tiltdown
1
@bybloggers Я знаю, что это сообщение немного устарело, но было бы любопытно, не могли бы вы поделиться своей третьей функцией для передачи имени пользователя в URL-адресе шаблона?
Pat
@Pat Не уверен, где находится настоящая функция во всем моем коде в настоящее время (как вы сказали, это было некоторое время назад), но формат будет очень близко следовать функции wpleet_rewrite_catch (). Вместо array_key_exists ('user') я проверял общедоступный идентификатор пользователя, а затем выполнял поиск в таблице wp_usermeta, чтобы определить, с каким пользователем был связан этот общедоступный идентификатор. Надеюсь, что алгоритм поможет, даже если код не доступен.
bybloggers
2

Я нашел это ранее сегодня и сделал некоторые изменения в коде @bybloggers с той разницей, что вместо использования template_redirect я изменяю запрос на отображение статической страницы, это означает, что теперь вы можете добавлять все, что вам нравится, в шаблон страницы и использовать его на этом стр.

class ProfilePage {
function __construct() {
    add_filter( 'init',array($this,'rw_init'));
    add_filter( 'query_vars', array($this,'wpleet_rewrite_add_var') );
    add_filter( 'request', array($this,'change_requests'));
}
function wpleet_rewrite_add_var( $vars ) {
    $vars[] = 'usuario';
    return $vars;
}
function rw_init(){
    add_rewrite_tag( '%usuario%', '([^&]+)' );
    add_rewrite_rule(
        '^usuario/([^/]*)/?',
        'index.php?usuario=$matches[1]',
        'top'
    );
}
function change_requests($query_vars) {
    //go to a specific page when the usuario key is set
    $query_vars['page_id'] = isset($query_vars['usuario']) ? 7581 : $query_vars['page_id'];
    return $query_vars;
}
}
new ProfilePage();

Испанский -> usuario = пользователь <- английский

Poxtron
источник
Очень хорошо! Спасибо, что поделились этим. Я хотел бы сделать более динамичным, и вы можете переключить идентификатор с get_page_by_path('page-slug')->ID. Также не забывайте об использовании flush_rewrite_rules, поэтому я бы добавил, как:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Лео Казейро
1

Это мой рабочий код, основанный на ответе @bybloggers (спасибо, кстати). Я просто узнал, что мы не должны использовать ловушку template_redirect и затем выходить из php, потому что некоторые вещи могут перестать работать из-за внезапного прерывания выполнения кода php.

Объяснение здесь: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Итак, мы должны использовать хук template_include. С этим хуком нет необходимости использовать метод перенаправления и выхода.

И другое отличие состоит в том, что мне просто нужно было www.server.com/myaccount без / userid.

Это код:

add_filter( 'query_vars', 'wp58683_userprofile_var' );
function wp58683_userprofile_var( $vars )
{
    $vars[] = 'myprofile';
    return $vars;
}

add_rewrite_tag( '%myprofile%', '([^&]+)' );

add_rewrite_rule(
    '^myprofile/?',
    'index.php?myprofile',
    'top'
);

add_action( 'template_include', 'wp58683_userprofile_page' );
function wp58683_userprofile_page($original_template)
{
    global $wp_query;

    if ( array_key_exists( 'myprofile', $wp_query->query_vars ) ) {
        if (is_user_logged_in() ){ 
            return TEMPLATEPATH . '/user-profile.php';
        }
    }
    else {
        return $original_template;
    }

}
Карлос Б
источник
0

Другой способ заключается в использовании Buddypress, который имеет эту встроенную функцию, даже если плагин обладает еще большей функциональностью, которая может не представлять интереса.

http://wordpress.org/extend/plugins/buddypress/

Йенс Ведин
источник