วิธีการสร้างโพรไฟล์ผู้ใช้ส่วนหน้าด้วยลิงก์ถาวรที่เป็นมิตร


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

จากนั้นคุณสามารถใช้เทมเพลต author.php ในตัวเพื่อปรับเปลี่ยนเนื้อหาหัวใจของคุณ

ขอแสดงความนับถือตรวจสอบลิงก์ข้างต้นเนื่องจาก Jan Fabry ทำงานได้ดีเยี่ยมอธิบายทุกอย่าง

Query Vars และเทมเพลตหน้า

สำหรับชุดรูปแบบที่ฉันกำลังทำงานในขณะที่ค้นพบวิธีแก้ไขปัญหาเหล่านี้ฉันต้องแสดงหน้าเว็บที่กำหนดเองตามค่าเมตาผู้ใช้ (รหัสแยกต่างหาก) ลูกค้าของฉันไม่ต้องการให้ชื่อผู้ใช้หรือ ID ผู้ใช้ปรากฏต่อสาธารณะดังนั้นเราจึงสร้างเลเยอร์แยกต่างหาก

ปัญหาเดียว ในขณะนี้ยังไม่มีวิธีที่ชัดเจนในการใช้ Rewrite API เพื่อสืบค้นด้วยคีย์ / ค่าเมตา โชคดีที่มีทางออก

ในไฟล์ 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;
}

จากนั้นคุณต้องสร้างแท็กและกฎการเขียนใหม่เพื่อให้ทราบว่าเมื่อใดและอย่างไรที่จะจัดการกับวาร์แบบสอบถามใหม่

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

ข้อสรุป

ทั้งสองวิธีนี้เป็นวิธีการทำงานที่ถูกต้อง ประการที่สองเสนอเลเยอร์ "ความปลอดภัย" แยกต่างหากเนื่องจากไม่เปิดเผย ID ผู้ใช้หรือชื่อผู้ใช้หากบุคคลอื่นสามารถเรียกดูโปรไฟล์ได้

หวังว่าจะช่วยได้โปรดแจ้งให้เราทราบหากคุณมีข้อสงสัย


ฉันจริงแก้มันโดยใช้วิธี Query_var ขอบคุณ!
tiltdown

1
@bybloggers ฉันรู้ว่าโพสต์นี้ค่อนข้างเก่า แต่ก็อยากรู้อยากเห็นถ้าคุณสามารถแบ่งปันฟังก์ชั่นที่สามของคุณเพื่อส่งชื่อผู้ใช้ใน URL ไปยังเทมเพลตได้หรือไม่
Pat

@Pat ไม่แน่ใจว่าฟังก์ชั่นที่แท้จริงนั้นอยู่ในรหัสของฉันทั้งหมดในเวลานี้ (อย่างที่คุณบอกว่ามันเป็นช่วงเวลาที่ผ่านมา) แต่รูปแบบจะเป็นไปตามฟังก์ชั่น wpleet_rewrite_catch () อย่างใกล้ชิด แทนที่จะเป็น array_key_exists ('ผู้ใช้') ฉันกำลังทดสอบหา ID ผู้ใช้สาธารณะแล้วทำการค้นหาบนตาราง wp_usermeta เพื่อดูว่าผู้ใช้รายใดมีรหัสสาธารณะที่เชื่อมโยงกับมัน หวังว่าอัลกอริทึมจะช่วยได้แม้ว่าจะไม่มีรหัสก็ตาม
bybloggers

2

ฉันพบสิ่งนี้ก่อนหน้านี้ในวันนี้และสร้าง modificatios ให้กับ @bybloggers code ด้วยความแตกต่างที่แทนการใช้ 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' );
Leo Caseiro

1

นี่คือรหัสการทำงานของฉันตามคำตอบ @bybloggers (ขอบคุณโดยวิธี) ฉันเพิ่งรู้ว่าเราไม่ควรใช้ hook_ แม่แบบ template_redirect แล้วออกจาก php เพราะบางสิ่งอาจหยุดทำงานเนื่องจากการหยุดชะงักอย่างกะทันหันของ php รันโค้ด

คำอธิบายอยู่ที่นี่: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

ดังนั้นเราควรใช้ตะขอ template_include ด้วยเบ็ดนี้ไม่จำเป็นต้องใช้วิธีการเปลี่ยนเส้นทางและออก

และข้อแตกต่างอื่น ๆ คือฉันต้องการ www.server.com/myaccount โดยไม่ต้องใช้ / หมายเลขผู้ใช้

นี่คือรหัส:

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

}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.