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:
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');
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.
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:
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 ) );.
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:
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?
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. }
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-
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
12991000cookie-checkEinfaches öffentliches Benutzerprofil für alle registrierten Benutzer anzeigen (nicht nur für Autoren)yes