Як створити профіль для переднього користувача з дружньою постійною посиланням


23

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

mysite.com/user/someusername

Будь-яка ідея про те, як я можу цього досягти? Я знаю, що це має щось спільне з правилом переписання, але я не маю уявлення про те, як це зробити. Якщо у вас є якесь посилання чи підручник для мене, це буде чудово.

Спасибі!

Відповіді:


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

Потім ви можете використовувати вбудований в авторський шаблон шаблон, змінюючи вміст ваших сердець.

З повагою, перегляньте посилання, перелічене вище, оскільки Ян Фабрі чудово роз'яснює все.

Варіанти запитів і шаблони сторінок

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

Єдина проблема? На даний момент не існує чіткого способу використання API переписати для запиту за мета-ключами / значеннями. На щастя, було рішення.

У вашому файлі function.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;
}

А потім вам потрібно створити новий тег перезапису та правити так, щоб він знав, коли та як обробити нову вару запиту.

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

Після цього вам просто потрібно "зловити", коли подається вар-запит, а потім перенаправити на обраний шаблон:

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.

Висновок

І те й інше є дійсними, робочими рішеннями. Другий пропонує окремий рівень "безпеки", оскільки він не розкриває ідентифікатори користувачів чи імена користувачів, якщо інші люди зможуть переглядати профілі.

Сподіваюся, що це допоможе, повідомте мені, якщо у вас є якісь питання.


Я фактично вирішив це за допомогою методу Query_var. Спасибі!
відхилення

1
@bybloggers Я знаю, що цей пост трохи старий, але мені було цікаво, чи можете ви поділитися своєю третьою функцією для передачі імені користувача у URL-адресу до шаблону?
Пат

@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 = користувач <- англійська


Дуже хороша! Дякуємо, що поділилися цим. Я хотів би зробити більш динамічним, і ви можете перемикати ідентифікатор 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;
    }

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.