Haftnotizen

Wie kann ich klebrige Kommentare haben? Ich versuche es so zu machen, dass ich einen Kommentar über alle anderen Kommentare schreiben kann. Ist das möglich? Wenn ja, mit welchem ​​Code kann ich das erreichen? Vielen Dank

Solutions Collecting From Web of "Haftnotizen"

Ich war neugierig auf vorhandene Plugins und durchsuchte das Plugin-Verzeichnis. Es gibt ein altes Sticky Comments Plugin, mit dem ich nicht verwandt bin. Es scheint einen klebrigen Metaschlüssel zu verwenden.

Es verwendet eine LEFT JOIN-Abfrage, erstellt jedoch eine eigene Version der gesamten corefunktion comments_template() , um die aktuelle Abfrage zu überschreiben. Man müsste diese benutzerdefinierte function aktualisieren, wenn sich die corefunktion ändert. Dies wurde höchstwahrscheinlich wegen der hartcodierten SQL-Abfragen gemacht, die diese function enthielt.

Jetzt, in WordPress 4.3.1, enthält die comments_template() -function nur einen einzigen get_comments() Aufruf und wir können daher einen einzelnen Filter verwenden, um ihn zu überschreiben.

Hier sind einige Ideen, wie man das macht:

Methode 1

Wir könnten den klebrigen Kommentartyp verwenden, um die Kommentare zu markieren.

Dann könnten wir den pre_get_comments Hook verwenden, um die Reihenfolge anzupassen:

 add_action( 'pre_get_comments', 'wpse_comment_stickies_v1' ); function wpse_comment_stickies_v1( \WP_Comment_Query $q ) { // Only run it once remove_action( current_action(), __FUNCTION__ ); // Modify the ordering, so sticky comments are at the top $q->query_vars[ 'orderby'] = [ 'comment_type' => 'DESC', 'comment_date_gmt' => 'ASC', 'comment_ID' => 'ASC' ]; } 

wo du die Zeile hinzufügen musst:

 add_action( 'pre_get_comments', 'wpse_comment_stickies_v1' ); 

kurz bevor das comments_template() in deinem Theme aufruft.

Die Array-Reihenfolge wurde in WordPress 4.2 hinzugefügt, aber der Codex in WP_Comment_Query dies nicht.

Methode # 2

Dieser ist ähnlich wie in # 1, aber hier verwenden wir den Filter comments_clauses , um die Reihenfolge der Kommentare zu ändern:

 add_filter( 'comments_clauses', 'wpse_comment_stickies_v2' ); function wpse_comment_stickies_v2( $clauses ) { global $wpdb; // Only run it once remove_filter( current_filter(), __FUNCTION__ ); // Modify the ordering, so sticky comments are at the top $clauses['orderby'] = $wpdb->comments . '.comment_type DESC, ' . $clauses['orderby']; return $clauses; } 

Methode # 3

Wir könnten auch das Kommentar-Meta verwenden. Wenn wir die klebrigen Kommentare mit dem sticky Kommentar-Meta markieren, können wir die Reihenfolge ändern mit:

 add_action( 'comments_clauses', 'wpse_stickies_v3' ); function wpse_stickies_v3( $clauses ) { global $wpdb; // LEFT JOIN the comments table and the comments meta table $clauses['join'] .= " LEFT JOIN {$wpdb->commentmeta} wpsecm ON ( wpsecm.comment_id = {$wpdb->comments}.comment_ID AND wpsecm.meta_key = 'sticky' ) "; // Order by the meta key $clauses['orderby'] = 'wpsecm.meta_key DESC, ' . $clauses['orderby']; return $clauses; } 

Methode # 4

Dies ist ähnlich wie in # 3, aber wir modifizieren nur die orderby Klausel:

 add_action( 'comments_clauses', 'wpse_stickies_v4' ); function wpse_stickies_v4( $clauses ) { global $wpdb; $orderby = []; $orderby[] = " ( SELECT COUNT( comment_ID ) FROM {$wpdb->commentmeta} wpsecm WHERE wpsecm.comment_id = {$wpdb->comments}.comment_ID AND wpsecm.meta_key = 'sticky' ) DESC "; $orderby[] = $clauses['orderby']; $clauses['orderby'] = join( ',', $orderby ); return $clauses; } 

Anmerkungen

Manchmal wünschte ich, es gäbe in arguments comments template() einen Argumentfilter, um es einfacher zu machen, nur auf seine Abfrage zu zielen, weil Sie nicht mit anderen get_comments() -Aufrufen, zB in den Widgets, get_comments() wollen.

Ich habe ein Ticket # 34442 mit einigen Vorschlägen erstellt, das es einfacher machen würde, diese Abfrage von einem Plugin aus anzusprechen.

In WordPress 4.4 wird der Aufruf get_comments() ersetzt durch:

 $comment_query = new WP_Comment_Query( $comment_args ); 

aber das wird sich nicht viel ändern, da get_comments() nur ein einfacher WP_Comment_Query Wrapper ist.

Ich habe hier nicht erwähnt, wie man die Benutzeroberfläche modifizieren könnte, um die klebrigen Kommentare zu markieren. Aber Sie können dieses alte Plugin, das ich bereits erwähnt habe, auf Ideen hin überprüfen.