Cara membuat profil pengguna ujung depan dengan permalink yang ramah

23

Saya ingin membuat halaman profil front-end publik dengan url ramah seperti format ini.

mysite.com/user/someusername

Ada ide tentang bagaimana saya bisa mencapai ini? Saya tahu ini ada hubungannya dengan aturan penulisan ulang tetapi saya tidak tahu bagaimana saya bisa melakukannya. Jika Anda punya tautan atau tutorial untuk saya, itu akan sangat bagus.

Terima kasih!

tiltdown
sumber

Jawaban:

15

Ada dua cara yang saya temukan dalam melakukan ini:

  1. Halaman Pembuat dengan aturan penulisan ulang kustom
  2. File template khusus dipasangkan dengan aturan penulisan ulang

Yang pertama lebih mudah diterapkan, tetapi mungkin tidak berfungsi dalam semua keadaan (salah satunya akan saya jelaskan segera).

Aturan Penulisan Ulang Kustom

Saya menemukan solusi ini beberapa hari yang lalu di sini: Penulisan Ulang URL

Dan ini kodenya, dengan komentar:

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

Anda kemudian dapat menggunakan templat author.php bawaan, memodifikasi konten hati Anda.

Hormat kami, periksa tautan yang tercantum di atas, karena Jan Fabry melakukan pekerjaan yang sangat baik untuk menjelaskan semuanya.

Vektor Kueri dan Templat Halaman

Untuk tema yang sedang saya kerjakan saat menemukan solusi ini, saya perlu menyajikan halaman khusus berdasarkan nilai meta pengguna (ID terpisah). Klien saya tidak ingin nama pengguna atau ID pengguna terlihat secara publik, jadi kami membuat layer terpisah.

Satu-satunya masalah? Saat ini, tidak ada cara yang jelas bagaimana menggunakan API Rewrite untuk melakukan kueri dengan kunci / nilai meta. Untungnya, ada solusinya.

Di file functions.php Anda ...

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

Dan kemudian, Anda perlu membuat tag dan aturan penulisan ulang baru sehingga tahu kapan dan bagaimana menangani var permintaan baru.

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

Setelah Anda melakukan ini, Anda hanya perlu "menangkap" ketika var permintaan disajikan, dan kemudian mengarahkan ulang ke templat pilihan Anda:

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

Pastikan Anda telah membuat user-profile.php.

Dalam contoh saya sendiri, saya membuat fungsi ketiga yang cocok dengan "ID pengguna publik" dengan user_id aktual melalui tabel $ wpdb-> usermeta, dan meneruskan informasi ke templat.

Jika Anda perlu membuat templat yang berbeda dari sisa tema Anda, ingat bahwa dengan get_header, Anda dapat menentukan nama:

get_header( 'user' );

Yang akan memanggil file header-user.php.

Kesimpulan

Keduanya adalah solusi yang valid dan berfungsi. Yang kedua menawarkan lapisan "keamanan" yang terpisah karena tidak mengungkapkan ID pengguna atau nama pengguna, jika orang lain akan dapat menelusuri profil.

Semoga itu bisa membantu, beri tahu saya jika Anda memiliki pertanyaan.

olehbloggers
sumber
Saya benar-benar menyelesaikannya menggunakan metode Query_var. Terima kasih!
tiltdown
1
@bybloggers Saya tahu posting ini agak lama, tetapi ingin tahu apakah Anda dapat berbagi fungsi ketiga Anda untuk meneruskan nama pengguna di URL ke template?
Pat
@Pat Tidak yakin di mana fungsi aktual dalam semua kode saya saat ini (seperti yang Anda katakan, itu beberapa waktu yang lalu), tetapi format akan mengikuti fungsi wpleet_rewrite_catch () sangat erat. Alih-alih array_key_exists ('pengguna'), saya menguji ID pengguna publik, dan kemudian melakukan pencarian di tabel wp_usermeta untuk melihat pengguna mana yang memiliki ID publik yang terkait dengannya. Semoga algoritma membantu, bahkan jika kode tidak tersedia.
olehbloggers
2

Saya menemukan ini sebelumnya hari ini dan membuat beberapa modificatios ke kode @bybloggers dengan perbedaan bahwa alih-alih menggunakan template_redirect saya mengubah permintaan untuk menampilkan halaman statis, itu berarti bahwa Anda sekarang dapat menambahkan apa pun yang Anda suka ke templat halaman dan menggunakannya pada itu halaman.

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();

Spanyol -> usuario = pengguna <- Bahasa Inggris

Poxtron
sumber
Sangat bagus! Terima kasih telah membagikannya. Saya ingin membuat lebih dinamis dan Anda dapat mengganti id get_page_by_path('page-slug')->ID. Juga jangan lupa gunakan flush_rewrite_rules, jadi saya akan menambahkan seperti:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro
1

Ini adalah kode kerja saya berdasarkan jawaban @bybloggers (terima kasih omong-omong) Saya baru belajar bahwa kita seharusnya tidak menggunakan hook template_redirect dan kemudian keluar dari php, karena beberapa hal mungkin berhenti bekerja karena gangguan mendadak kode eksekusi php.

Penjelasannya ada di sini: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Jadi, kita harus menggunakan kait template_include. Dengan kait ini, tidak perlu menggunakan metode redirect dan exit.

Dan perbedaan lainnya adalah saya hanya perlu www.server.com/myaccount tanpa / userid.

Ini kodenya:

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

}
Carlos B
sumber
0

Cara lain adalah dengan menggunakan Buddypress yang memiliki built-in ini bahkan jika plugin memiliki lebih banyak fungsi yang mungkin tidak menarik.

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

Jens Wedin
sumber