So erstellen Sie ein Front-End-Benutzerprofil mit einem benutzerfreundlichen Permalink

23

Ich möchte eine öffentliche Front-End-Profilseite mit einer freundlichen URL wie diesem Format erstellen.

mysite.com/user/someusername

Irgendeine Idee, wie ich das erreichen kann? Ich weiß, dass es etwas mit Umschreiberegeln zu tun hat, aber ich habe keine Ahnung, wie ich das tun kann. Wenn Sie einen Link oder ein Tutorial für mich haben, ist das großartig.

Vielen Dank!

nach unten kippen
quelle

Antworten:

15

Dabei habe ich zwei Möglichkeiten entdeckt:

  1. Autorenseite mit einer benutzerdefinierten Umschreiberegel
  2. Eine benutzerdefinierte Vorlagendatei gepaart mit einer Umschreiberegel

Die erste ist einfacher zu implementieren, funktioniert jedoch möglicherweise nicht unter allen Umständen (eine davon werde ich bald beschreiben).

Benutzerdefinierte Umschreiberegel

Ich habe diese Lösung vor ein paar Tagen hier gefunden: URL Rewriting

Und hier ist der Code mit Kommentaren:

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

Sie können dann die eingebaute Vorlage author.php verwenden und den Inhalt nach Herzenslust ändern.

Mit freundlichen Grüßen, überprüfen Sie den oben aufgeführten Link, da Jan Fabry eine hervorragende Arbeit leistet, um alles zu erklären.

Abfragevariablen und Seitenvorlagen

Für das Thema, an dem ich bei der Suche nach diesen Lösungen gearbeitet habe, musste eine benutzerdefinierte Seite bereitgestellt werden, die auf einem Benutzer-Metawert (einer separaten ID) basierte. Mein Kunde wollte nicht, dass der Benutzername oder die Benutzer-ID öffentlich angezeigt wird. Deshalb haben wir eine separate Ebene erstellt.

Das einzige Problem? Derzeit ist nicht klar, wie die Rewrite-API zum Abfragen nach Metaschlüsseln / -werten verwendet werden kann. Zum Glück gab es eine Lösung.

In deiner functions.php Datei ...

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

Anschließend müssen Sie ein neues Umschreibetag und eine neue Regel erstellen, damit diese wissen, wann und wie mit der neuen Abfragevariable umzugehen ist.

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

Sobald Sie dies getan haben, müssen Sie nur noch "fangen", wenn die Abfragevariable geliefert wird, und dann zu der Vorlage Ihrer Wahl umleiten:

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

Stellen Sie einfach sicher, dass Sie user-profile.php erstellt haben.

In meinem eigenen Beispiel habe ich eine dritte Funktion erstellt, die die "öffentliche Benutzer-ID" über die Tabelle "$ wpdb-> usermeta" mit der tatsächlichen Benutzer-ID übereinstimmt, und die Informationen an die Vorlage übergeben.

Wenn Sie eine Vorlage erstellen müssen, die sich vom Rest Ihres Themas unterscheidet, denken Sie daran, dass Sie mit get_header einen Namen angeben können:

get_header( 'user' );

Welches wird die header-user.php-Datei aufrufen.

Fazit

Beides sind gültige, funktionierende Lösungen. Die zweite Ebene bietet eine separate "Sicherheitsebene", da Benutzer-IDs oder Benutzernamen nicht angezeigt werden, wenn andere Benutzer in der Lage sind, die Profile zu durchsuchen.

Hoffe das hilft, lass es mich wissen, wenn du irgendwelche Fragen hast.

von Bloggern
quelle
Ich habe es tatsächlich mit der Query_var-Methode gelöst. Vielen Dank!
Tiltdown
1
@bybloggers Ich weiß, dieser Beitrag ist ein bisschen alt, aber war neugierig, ob Sie Ihre dritte Funktion für die Übergabe des Benutzernamens in der URL an die Vorlage teilen könnten?
Pat
@Pat Ich bin mir nicht sicher, wo sich die eigentliche Funktion in meinem gesamten Code zu diesem Zeitpunkt befindet (wie Sie sagten, war es eine Weile her), aber das Format würde der Funktion wpleet_rewrite_catch () sehr genau folgen. Anstelle von array_key_exists ('user') habe ich nach der öffentlichen Benutzer-ID gesucht und dann in der Tabelle wp_usermeta gesucht, um festzustellen, welchem ​​Benutzer diese öffentliche ID zugeordnet war. Hoffe, der Algorithmus hilft, auch wenn der Code nicht verfügbar ist.
Bybloggers
2

Ich habe dies heute früher gefunden und einige Änderungen am @ bybloggers-Code vorgenommen, mit dem Unterschied, dass ich anstelle von template_redirect die Anforderung so ändere, dass eine statische Seite angezeigt wird. Das bedeutet, dass Sie einer Seitenvorlage jetzt alles hinzufügen können, was Sie möchten, und diese dann verwenden können Seite.

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

Spanisch -> usuario = user <- Englisch

Poxtron
quelle
Sehr schön! Vielen Dank für das Teilen. Ich möchte dynamischer machen und Sie können die ID mit wechseln get_page_by_path('page-slug')->ID. Vergessen Sie auch nicht die Verwendung flush_rewrite_rules, also möchte ich hinzufügen:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro
1

Dies ist mein Arbeitscode basierend auf der Antwort von @bybloggers (danke übrigens) Ich habe gerade erfahren, dass wir template_redirect nicht verwenden und dann PHP beenden sollten, da einige Dinge möglicherweise aufgrund der abrupten Unterbrechung der Ausführung von PHP-Code nicht mehr funktionieren.

Die Erklärung finden Sie hier: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Wir sollten also den Hook template_include verwenden. Bei diesem Hook ist es nicht erforderlich, die Umleitungs- und Beendigungsmethode zu verwenden.

Und der andere Unterschied ist, dass ich nur www.server.com/myaccount ohne die / userid brauchte.

Dies ist der Code:

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
quelle
0

Eine andere Möglichkeit besteht darin, Buddypress zu verwenden, das über diese Funktion verfügt, auch wenn das Plugin über noch mehr Funktionen verfügt, die möglicherweise nicht von Interesse sind.

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

Jens Wedin
quelle