फ्रेंडली पर्मलिंक के साथ फ्रंट एंड यूजर प्रोफाइल कैसे बनाएं


23

मैं इस प्रारूप जैसे दोस्ताना यूआरएल के साथ एक सार्वजनिक फ्रंट-एंड प्रोफाइल पेज बनाना चाहता हूं।

mysite.com/user/someusername

मैं इसे कैसे प्राप्त कर सकता हूं इस पर कोई विचार? मुझे पता है कि इसे फिर से लिखने के नियम के साथ कुछ करना है लेकिन मुझे इस पर कोई विचार नहीं है कि मैं ऐसा कैसे कर सकता हूं। अगर आपको मेरे लिए कोई लिंक या ट्यूटोरियल मिला है जो बहुत अच्छा होगा।

धन्यवाद!

जवाबों:


15

मैंने ऐसा करने के दो तरीके खोजे हैं:

  1. एक कस्टम पुनर्लेखन नियम के साथ लेखक पृष्ठ
  2. एक कस्टम टेम्पलेट फ़ाइलों को फिर से लिखना नियम के साथ जोड़ा गया है

पहले लागू करने के लिए अधिक सरल है, लेकिन सभी परिस्थितियों में काम नहीं कर सकता है (जिनमें से एक मैं जल्द ही वर्णन करूंगा)।

कस्टम रीराइट नियम

मुझे यह समाधान कुछ दिन पहले यहां मिला था: यूआरएल रिवाइटरिंग

और यहाँ कोड है, टिप्पणियों के साथ:

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

फिर आप अपने दिल की सामग्री को संशोधित करके लेखक में निर्मित टेम्पलेट का उपयोग कर सकते हैं।

ईमानदारी से, ऊपर सूचीबद्ध लिंक की जाँच करें, क्योंकि Jan Fabry एक उत्कृष्ट काम करता है जो सब कुछ समझाता है।

क्वेरी संस्करण और पृष्ठ टेम्पलेट

इन समाधानों की खोज करते समय मैं जिस विषय पर काम कर रहा था, उसके लिए मुझे एक उपयोगकर्ता मेटा मान (एक अलग आईडी) के आधार पर एक कस्टम पृष्ठ की सेवा करने की आवश्यकता थी। मेरा ग्राहक सार्वजनिक रूप से उपयोगकर्ता नाम या उपयोगकर्ता आईडी नहीं देखना चाहता था, इसलिए हमने एक अलग परत बनाई।

एकमात्र समस्या? फिलहाल, कोई स्पष्ट तरीका नहीं है कि मेटा एपीआई / मानों द्वारा क्वेरी के लिए रीराइट एपीआई का उपयोग कैसे करें। सौभाग्य से, वहाँ एक समाधान था।

अपने कार्यों में। 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 बनाया है।

अपने स्वयं के उदाहरण में, मैंने एक तीसरा फ़ंक्शन बनाया जो $ wpdb-> usermeta तालिका के माध्यम से वास्तविक user_id से "सार्वजनिक उपयोगकर्ता आईडी" से मेल खाता है, और जानकारी को टेम्पलेट में पास कर दिया है।

यदि आपको अपने विषय के बाकी हिस्सों से अलग एक टेम्पलेट बनाने की आवश्यकता है, तो याद रखें कि get_header के साथ, आप एक नाम निर्दिष्ट कर सकते हैं:

get_header( 'user' );

जो हैडर-user.php फाइल को कॉल करेगा।

निष्कर्ष

ये दोनों ही मान्य हैं, काम कर रहे समाधान। दूसरा "सुरक्षा" की एक अलग परत प्रदान करता है क्योंकि यह उपयोगकर्ता आईडी या उपयोगकर्ता नाम प्रकट नहीं करता है, अगर अन्य लोग प्रोफ़ाइल ब्राउज़ करने में सक्षम होंगे।

आशा है कि मदद करता है, मुझे पता है अगर आप किसी भी प्रश्न हैं।


मैंने वास्तव में इसे Query_var विधि का उपयोग करके हल किया था। धन्यवाद!
tiltdown

1
@bybloggers मुझे पता है कि यह पोस्ट थोड़ी पुरानी है, लेकिन उत्सुक था कि क्या आप URL में यूज़रनेम को टेम्पलेट में पास करने के लिए अपना तीसरा फंक्शन शेयर कर सकते हैं?
पैट

@ पता नहीं कि इस समय मेरे सभी कोड में वास्तविक फ़ंक्शन कहां है (जैसा कि आपने कहा, यह कुछ समय पहले था), लेकिन प्रारूप wpleet_rewrite_catch () फ़ंक्शन का बहुत बारीकी से पालन करेगा। Array_key_exists ('user') के बजाय, मैं सार्वजनिक उपयोगकर्ता आईडी के लिए परीक्षण कर रहा था, और फिर wp_usermeta तालिका पर एक खोज कर रहा था कि यह देखने के लिए कि किस उपयोगकर्ता के पास इससे जुड़ी सार्वजनिक आईडी थी। आशा है कि एल्गोरिथ्म मदद करता है, भले ही कोड उपलब्ध न हो।
bybloggers

2

मैंने आज यह पहले पाया और कुछ भिन्नता के साथ @bybloggers कोड को कुछ modificatios बनाया कि 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 की आवश्यकता थी।

यह कोड है:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.