Dost canlı bir kalıcı bağlantıyla ön uç kullanıcı profili nasıl oluşturulur


23

Bu format gibi arkadaşça bir URL ile genel bir ön uç profil sayfası oluşturmak istiyorum.

mysite.com/user/someusername

Bunu nasıl başarabilirim hakkında bir fikrin var mı? Bunun yeniden yazma kuralıyla ilgisi olduğunu biliyorum ama nasıl yapabilirim hakkında hiçbir fikrim yok. Benim için herhangi bir bağlantı veya öğretici varsa, bu harika olacak.

Teşekkürler!

Yanıtlar:


15

Bunu yaparken keşfettiğim iki yol var:

  1. Özel bir yeniden yazma kuralına sahip Yazar Sayfası
  2. Özel bir şablon dosyaları yeniden yazma kuralıyla eşleştirildi

İlki uygulamak daha basittir, ancak her koşulda çalışmayabilir (bunlardan birini yakında tarif edeceğim).

Özel Yeniden Yazım Kuralı

Bu çözümü birkaç gün önce burada buldum: URL Yeniden Yazma

Ve işte kod, yorumlarla birlikte:

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

Daha sonra kalpler içeriğinizde değişiklik yaparak, yerleşik author.php şablonunu kullanabilirsiniz.

Saygılarımla, Jan Fabry her şeyi açıklayan mükemmel bir iş çıkardığından yukarıda listelenen bağlantıyı kontrol edin.

Sorgu Vars ve Sayfa Şablonları

Bu çözümleri keşfederken üzerinde çalıştığım tema için, kullanıcı meta değerine (ayrı bir ID) dayalı özel bir sayfa sunmam gerekiyordu. Müşterim kullanıcı adının veya kullanıcı kimliğinin herkese açık görünmesini istemedi, bu yüzden ayrı bir katman oluşturduk.

Tek sorun? Şu anda, yeniden yazma API'sini meta anahtarlar / değerler ile sorgulamak için nasıl kullanılacağının açık bir yolu yoktur. Neyse ki, bir çözüm vardı.

Functions.php dosyanızda ...

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

Ve sonra, yeni bir yeniden yazma etiketi oluşturmalı ve yeni sorgunun ne zaman ve nasıl ele alınacağını bilmesi için kural vermelisiniz.

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

Bunu yaptıktan sonra, sadece sorgu var sunulurken "yakalamak" ve sonra istediğiniz şablona yönlendirmek gerekir:

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

Sadece user-profile.php dosyasını oluşturduğunuzdan emin olun.

Kendi örneğimde, "public User ID" yi $ wpdb-> usermeta tablosu aracılığıyla asıl user_id ile eşleştiren üçüncü bir işlev oluşturdum ve bilgileri şablona ilettim.

Temanızın geri kalanından farklı bir şablon oluşturmanız gerekirse, get_header ile bir ad belirtebileceğinizi unutmayın:

get_header( 'user' );

Hangi header-user.php dosyasını çağırır.

Sonuç

Bunların her ikisi de geçerli, çalışan çözümler. İkincisi, başkalarının profillere göz atması mümkün olacaksa, kullanıcı kimliklerini veya kullanıcı adlarını göstermediğinden, ayrı bir "güvenlik" katmanı sunar.

Bu yardımcı olur umarım, herhangi bir sorunuz varsa bana bildirin.


Aslında Query_var yöntemini kullanarak çözdüm. Teşekkürler!
tiltdown

1
@ bybloggers Bu yazının biraz eski olduğunu biliyorum, ancak kullanıcı adınızı URL’deki şablona şablona aktarmak için üçüncü işlevinizi paylaşabilir misiniz?
Pat

@Pat Şu anda asıl işlevin kodumun neresinde olduğundan emin değilim (dediğiniz gibi, bir süre önce öyleydi), ancak biçim wpleet_rewrite_catch () işlevini çok yakından izleyecekti. Array_key_exists ('user') yerine, genel kullanıcı kimliğini test ediyordum ve ardından hangi kullanıcının kendisiyle ilişkili hangi genel kimliğe sahip olduğunu görmek için wp_usermeta tablosunda bir arama yapıyordum. Kod mevcut olmasa bile algoritmanın yardımcı olacağını umuyorum.
bybloggers

2

Bunu bugün daha erken buldum ve şablonda @rebect kullanmak yerine, statik bir sayfa gösterme isteğini değiştirdiğim anlamına gelir. Bu, şimdi bir sayfa şablonuna istediğiniz herhangi bir şeyi ekleyebileceğiniz ve bu amaçla kullanabileceğiniz anlamına gelen @bybloggers kodunda bazı değişiklikler yaptı. sayfa.

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

İspanyolca -> usuario = kullanıcı <- İngilizce


Çok hoş! Bunu paylaştığın için teşekkürler. Daha dinamik hale getirmek istiyorum ve kimliğini değiştirebilirsin get_page_by_path('page-slug')->ID. Ayrıca kullanmayı unutmayın flush_rewrite_rules, bu yüzden şöyle add_action( 'after_switch_theme', 'flush_rewrite_rules' );
eklerdim

1

Bu, @bybloggers cevabını temel alan çalışma kodum (bu arada teşekkürler) Sadece template_redirect hook kullanmamamız ve php'dan çıkmamamız gerektiğini öğrendim, çünkü bazı şeyler php yürütme kodunun aniden kesilmesi nedeniyle çalışmayı durdurabilir.

Açıklama burada: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Bu yüzden template_include kancasını kullanmalıyız. Bu kanca ile, yönlendirme ve çıkış yöntemini kullanmaya gerek yoktur.

Ve diğer fark, / userid'siz sadece www.server.com/myaccount adresine ihtiyacım olmasıydı.

Bu kod:

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

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.