wake-up-neo.com

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

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!

23
tiltdown

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 author.php-Vorlage 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 Datei header-user.php 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.

15
bybloggers

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

2
Poxtron

Dies ist mein Arbeitscode basierend auf der Antwort von @bybloggers (danke übrigens) Ich erfahre nur, dass wir template_redirect nicht verwenden sollten, um dann PHP zu beenden, da einige Dinge möglicherweise aufgrund der abrupten Unterbrechung des PHP-Ausführungscodes 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.

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

}
1
Carlos B

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

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

0
Jens Wedin