Einfaches öffentliches Benutzerprofil für alle registrierten Benutzer anzeigen (nicht nur für Autoren)

Lesezeit: 8 Minuten

Benutzer-Avatar
Alexander Färber

Im ein einfaches WordPress-Plugin Ich habe Kommentatoren-Links auf die URL umgeleitet /user/user_id mit folgendem Code:

define('PROFILE', '<a href="https://stackoverflow.com/user/%d">%s</a>');

function my_get_comment_author_link($comment_ID) {
    global $comment;
    return sprintf(PROFILE, $comment->user_id, 
                            $comment->comment_author);
}

add_action('get_comment_author_link',
           'my_get_comment_author_link');

Wie könnte ich bitte ein einfaches öffentliches Benutzerprofil (für alle registrierten Benutzer und nicht nur für Autoren) anzeigen, das den Benutzernamen unter dieser URL anzeigt?

Ich denke, ich sollte ein PHP-Skript in meinem untergeordneten 2013-Design erstellen –

<?php
/* Template Name: Public User Profile */
?>

<?php get_header(); ?>

<?php 
      $my_query = new WP_Query($args);
      // somehow get the user ID out of URL?
      // somehow get the WP_User object?
      printf('<p>Name: %s</p>', $user->display_name);
?>

<?php get_footer(); ?>

Aber wie bringt man WordPress dazu, dieses PHP-Skript auszuführen, wenn die URL /user/user_id wird angefragt?

Soll ich die verwenden API umschreiben hier und wie? Ich habe folgendes probiert, sehe aber keine Wirkung:

                    add_rewrite_rule('/user/(\d+)',
                                     'index.php?XXX=$matches[1]',
                                     'top'
                    );
                    flush_rewrite_rules();

Oder übersehe ich etwas, wie vielleicht sollte ich zuerst einen benutzerdefinierten Beitragstyp hinzufügen? (Wie Sie sehen, bin ich verwirrt und “in den Dokumenten verloren”).

AKTUALISIEREN:

Kann ich vielleicht überschreiben the_content Hook – aber wie erkennt man das a /user/user_id Seite wurde aufgerufen?

function my_content($content)
{
    if (NOT /user/user_id CALLED)
        return $content;

    // otherwise somehow extract the user_id
    // somehow get the corresponding WP_User
    return sprintf('<p>Name: %s</p>', $user->display_name);
}

add_action('the_content', 'my_content');

Benutzer-Avatar
Birgire

Hier sind einige (hoffentlich hilfreiche) Bemerkungen:

  • Vermeiden Sie es, alles in eine riesige Superklasse zu packen, halten Sie Ihre Klassen so klein und konzentriert (aufgabenorientiert) wie möglich. Klassen automatisch laden kann auch praktisch sein.

  • Halten Sie Ihren add_rewrite_rule innerhalb der init Hook, weil Sie die Umschreibung nicht verlieren möchten, wenn Sie die Seite mit den Permalink-Einstellungen besuchen und die Permalinks erneut speichern:

    public static function init()
    {
        // ... your code  ...
    
        add_rewrite_rule(
            'user/([^/]*)/?',
            'index.php?wpcg_user=$matches[1]',
            'top'
        );              
    }
    

    Beachten Sie die /? Teil, um beides zu berücksichtigen user/123 und user/123/. Das add_rewrite_rule() call wird die Rewrite-Regeln nicht automatisch löschen.

  • Eine andere Möglichkeit besteht darin, einen Endpunkt bei zu registrieren add_rewrite_endpoint :

    public static function init()
    {
        // ... your code  ...
    
        add_rewrite_endpoint( 'user', EP_ALL );
    }
    

    wo Sie die Orte ändern können, an denen es zugänglich sein wird: EP_ALL, EP_PAGES, EP_PERMALINK, ... . Beachten Sie, dass eine neue Umschreibungsregel erstellt wird, wo /user/123/ zugeordnet ist ?user=123.

  • Du kannst den … benutzen template_redirect Aktion bzw template_include filtern, um zu ändern, welche Vorlage Sie anzeigen möchten.

  • Sie sollten Ihre benutzerdefinierte GET-Variable registrieren, wpcg_usermit dem query_vars filtern, zum Beispiel:

    public static function query_vars( $vars )
    {
        $vars[] = 'wpcg_user';
        return $vars;
    }
    

    damit Sie es später mit abrufen können get_query_var( 'wpcg_user' ).

  • Wann get_query_var( 'wpcg_user') nicht leer ist, wissen Sie, dass die angeforderte URL ähnlich ist http://example.com/user/123/.

  • Sie sollten dem WordPress-Administrator erlauben, die Standard-Plugin-Vorlage zu überschreiben, tpl-user.php, indem Sie es in das aktuelle Themenverzeichnis kopieren. Die Funktion locate_template kann dir dabei helfen:

    if ( '' != locate_template( 'tpl-user.php') ) 
    
  • Dein template_redirect -Methode, wenn Sie sich für die Verwendung des entsprechenden Hooks entscheiden, könnte dann so aussehen:

    public static function template_redirect()
    {
        $wpcg_user = get_query_var( 'wpcg_user' );
    
        $tpl="tpl-user.php";  // Your custom template file.
    
        if( ! empty( $wpcg_user ) )
        {
            if ( '' == locate_template( $tpl, TRUE ) )
                include( plugin_dir_path( __FILE__ ) . $tpl );  
    
            exit();
        }
    }
    

    wo Sie den Pfad möglicherweise an Ihre anpassen müssen tpl-user.php Vorlage, zum Beispiel wenn Sie es in einem Unterverzeichnis in Ihrer speichern wp-city-gender Plugin-Verzeichnis. Beachten Sie, dass wir das zweite Eingabeargument von verwenden locate_template() -Funktion, sodass die Vorlage geladen wird, wenn sie sie finden kann.

  • Dein tpl-user.php Template-Datei könnte so aussehen:

    <?php
     /* Template Name: Public User Profile */
     ?>
    
    <?php get_header(); ?>
    
    <div>
    <?php 
    // Get the user query:
    $wpcg_user = get_query_var( 'wpcg_user' );  
    
    // Get corresponding user by id:
    $user = get_user_by( 'id', absint( $wpcg_user ) );
    
    if( $user ):
        printf('<p> Name: %s </p>',   $user->display_name                      );
        printf('<p> City: %s </p>',   get_user_meta( $user->ID, 'city',   TRUE));
        printf('<p> Gender: %s </p>', get_user_meta( $user->ID, 'gender', TRUE));
    else:
        _e( 'Sorry, no user found!' );
    endif;
    ?>
    </div>
    
    <?php get_footer(); ?>
    

    wo wir die verwenden get_user_by() Funktion, um die entsprechenden Benutzerdaten abzurufen.

  • Wir hätten den Benutzer leicht gebrauchen können Schnecke anstelle des Benutzers Ich würdedurch die Nutzung get_user_by( 'slug', $wpcg_user ); Anstatt von get_user_by( 'id', absint( $wpcg_user ) );.

  • In Ihrem aktuellen Setup benötigen Sie Folgendes:

    add_action( 'template_redirect',  array( CNAME, 'template_redirect') );
    add_filter( 'query_vars',         array( CNAME, 'query_vars') );
    //add_action( 'template_include', array( CNAME, 'template_include') );
    

    aktivieren Sie die entsprechenden Hook-Callbacks.

  • Es stehen viele Tools zur Verfügung, die Ihnen bei benutzerdefinierten Umschreibungen helfen, z Monkeyman Rewrite Analyzer. Es wurde eine Weile nicht aktualisiert, funktioniert aber immer noch hervorragend.

    Hier ist ein Screenshot, der die zeigt /user/1/ Inspektion, mit der obigen Umschreibung:

    wpcg_user Inspektion

    Ich hoffe das hilft. Lassen Sie mich einfach wissen, wenn Sie Hilfe bei der Umsetzung benötigen. Ich habe diese Änderungen auf meiner Installation getestet und es hat dort funktioniert.

Aktualisieren:

Als Antwort auf einen Kommentar:

So behandeln Sie beispielsweise den Fall, dass sich die Vorlage in einem Unterverzeichnis befindet /templates/profile.php?

Wir können Folgendes verwenden:

if ( '' == locate_template( 'templates/profile.php', TRUE ) )
    include( plugin_dir_path( __FILE__ ) . 'templates/profile.php' );

Das heisst:

  • Wenn /wp-content/themes/MYTHEME/templates/profile.php gefunden wird, dann wird es automatisch geladen.

  • Anders: /wp-content/plugins/wp-city-gender/templates/profile.php geladen ist.

wo wir davon ausgehen __FILE__ ist in dem wp-city-gender Wurzelverzeichnis.

  • +1 Danke, das funktioniert – ich habe GitHub aktualisiert. Noch zwei Fragen bitte: 1. Warum rufst du die an get_template_part('tpl', 'user'), wenn die Vorlage nicht gefunden wird? 2. Wie füge ich den jQuery- und CSS-Code des DataTables-Plug-ins nur in meine Vorlagenseite ein, aber nicht in die restlichen Seiten meiner Website?

    – Alexander Farber

    27. Mai 2014 um 17:10 Uhr


  • Hallo @AlexanderFarber danke. Freut mich zu hören, dass es bei dir funktioniert hat. 1. Ich rufe die an get_template_part() Wenn locate_template() ist nicht leer, ansonsten füge ich die Vorlage hinzu, die mit dem Plugin geliefert wird. 2. Sie können beispielsweise eine Bedingung in die einfügen wp_enqueue_scripts Aktion, wo Sie überprüfen, ob get_query_var( 'wpcg_user' ) ist nicht leer, andernfalls fügen Sie Ihren benutzerdefinierten Stil/Skript nicht in die Warteschlange ein. Ich hoffe, das beantwortet diese beiden Fragen. Wenn nicht, kann ich versuchen, ein Beispiel zu konstruieren.

    – Birgire

    27. Mai 2014 um 18:11 Uhr


  • Es gibt keine dummen Fragen. Ich werde der Antwort ein Codebeispiel hinzufügen, wie mit Unterverzeichnissen umgegangen wird.

    – Birgire

    27. Mai 2014 um 18:45 Uhr

  • ps: du brauchst nicht beides add_rewrite_endpoint und add_rewrite_rule und Sie könnten vielleicht Ihre Verwaltungsformulare aus einer Datei hinzufügen, um die Dinge zu vereinfachen.

    – Birgire

    27. Mai 2014 um 19:09 Uhr


  • ja, verwenden get_template_part( 'templates/profile' ) sollte arbeiten.

    – Birgire

    27. Mai 2014 um 20:49 Uhr


Wie wäre es, wenn Sie die Seitenvorlage anstelle der URL überprüfen?

if ( is_page_template(‘public_profile.php’) ) { // Code, der ausgeführt wird, wenn die Seiten geladen werden, die die Vorlage der Datei public_profile.php (Ihre öffentliche Benutzerprofil-Vorlagendatei) verwenden. }

Sehen Sie sich diese Funktion an is_page_template()

Oder Sie können auch die Vorlage abrufen, die von der aktuellen Seite verwendet wird, um die Vorlage zu überprüfen. Sehen get_page_template()

  • +1 Danke, aber wo soll ich den Scheck hinstellen is_page_template? Im Wesentlichen index.php von WordPress? Ich verstehe nicht ganz, wie dein Vorschlag funktioniert.

    – Alexander Farber

    23. Mai 2014 um 18:18 Uhr


  • Ich würde vorschlagen, dass Sie es in Ihre function.php-Datei schreiben

    – Jamu

    29. Mai 2014 um 7:36 Uhr

WordPress zeigt jeder (egal ob Autor, Abonnent oder irgendetwas anderes) Benutzerdetails auf einer Seite www.example.com/author/[USER NAME] also müssen Sie nur auf diese URL umleiten-

www.example.com/author/<?php echo $comment->comment_author;?>

Und um das Format der Detailseite zu bearbeiten, sollten Sie die author.php Ihres Themes bearbeiten.

  • +1 danke, aber du meinst wahrscheinlich example.com/archives/author/[USER_NAME]? Auf meiner Website kann ich sehen slova.de/archives/author/afarber (ein Autor-Benutzer) und slova.de/archives/author/Kuchen (ein Contributor-Benutzer, die Seite zeigt jedoch “Nothing Found” an) …

    – Alexander Farber

    26. Mai 2014 um 10:25 Uhr


  • Hey, nein ich meine eigentlich www.example.com/author/[USER NAME]weil es mir auf meinem Server die Info-Seite des Autors anzeigt, die durch author.php in meinem Theme-Verzeichnis generiert wird.

    – prachar19

    26. Mai 2014 um 10:45 Uhr

  • Oh, also ist es vielleicht themenabhängig? Ich verwende das Stock 2013 Theme

    – Alexander Farber

    26. Mai 2014 um 10:55 Uhr

  • Sie können dies überprüfen, indem Sie nachsehen, ob Ihr Thema author.php enthält

    – prachar19

    26. Mai 2014 um 11:03 Uhr

1299100cookie-checkEinfaches öffentliches Benutzerprofil für alle registrierten Benutzer anzeigen (nicht nur für Autoren)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy