Support » Allgemeine Fragen » Core Widget „Recent comments“ anpassen / auch für private Posts anzeigen

  • Hallo zusammen

    zunächst etwas Hintergrund, dann die Frage

    Die verlinkte Seite ist meine „Testseite“, auf der ich rumprobiere (nur zur Info). Ich habe einen Bereich mit privaten Posts eingerichtet und über das Members-Plugin eine neue Rolle dazugepackt, so dass meine Abonnentinnen nach Anmeldung in WordPress alles sehen können. Im Hauptblog ist das zusätzlich noch mit einer Paywall geschützt, aber das ist hier uninteressant.

    Mein Problem: meine Leserinnen kommentieren oft und viel und orientieren sich auch sehr an vorhandenen Kommentaren. Im Seitenbereich verwende ich das Standardwidget „Recent comments“ – dort werden aber die Kommentare aus privaten Posts nicht angezeigt – was in diesem Fall aber genau erwünscht ist. Man sieht ja nur den Namen und den Titel des Posts, was in Ordnung ist.

    Nun habe ich mich zwei Stunden lang durchgewühlt, kein passendes Plugin oder sonst etwas fertiges gefunden. Aber ich habe eine Idee gefunden:

    1) Funktion aus class-wp-widget-recent-comments.php nehmen
    2) in mein Childtheme packen in functions.php

    und schon klappt es.

    Problem:

    Ich denke, es ist die Funktion weiter unten.

    Frage 1: wie packe ich die richtig in mein Child theme? derselbe Name???? anders??
    Frage 2: ich habe in der Mitte ‚post_status‘ => ‚publish‘ gefunden – wie erweitere ich das syntaktisch richtig um „private“?

    Ich bin eher so ein ambitionierter Laie mit IT-Verständnis und kein Developer. Es wäre super, wenn mir da jemand helfen könnte.

    LG Irit

    public function widget( $args, $instance ) {
    		static $first_instance = true;
    
    		if ( ! isset( $args['widget_id'] ) ) {
    			$args['widget_id'] = $this->id;
    		}
    
    		$output = '';
    
    		$default_title = __( 'Recent Comments' );
    		$title         = ( ! empty( $instance['title'] ) ) ? $instance['title'] : $default_title;
    
    		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
    		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
    
    		$number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
    		if ( ! $number ) {
    			$number = 5;
    		}
    
    		$comments = get_comments(
    			/**
    			 * Filters the arguments for the Recent Comments widget.
    			 *
    			 * @since 3.4.0
    			 * @since 4.9.0 Added the <code>$instance</code> parameter.
    			 *
    			 * @see WP_Comment_Query::query() for information on accepted arguments.
    			 *
    			 * @param array $comment_args An array of arguments used to retrieve the recent comments.
    			 * @param array $instance     Array of settings for the current widget.
    			 */
    			apply_filters(
    				'widget_comments_args',
    				array(
    					'number'      => $number,
    					'status'      => 'approve',
    					'post_status' => 'publish',
    				),
    				$instance
    			)
    		);
    
    		$output .= $args['before_widget'];
    		if ( $title ) {
    			$output .= $args['before_title'] . $title . $args['after_title'];
    		}
    
    		$recent_comments_id = ( $first_instance ) ? 'recentcomments' : "recentcomments-{$this->number}";
    		$first_instance     = false;
    
    		$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';
    
    		/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
    		$format = apply_filters( 'navigation_widgets_format', $format );
    
    		if ( 'html5' === $format ) {
    			// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
    			$title      = trim( strip_tags( $title ) );
    			$aria_label = $title ? $title : $default_title;
    			$output    .= '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
    		}
    
    		$output .= '<ul id="' . esc_attr( $recent_comments_id ) . '">';
    		if ( is_array( $comments ) && $comments ) {
    			// Prime cache for associated posts. (Prime post term cache if we need it for permalinks.)
    			$post_ids = array_unique( wp_list_pluck( $comments, 'comment_post_ID' ) );
    			_prime_post_caches( $post_ids, strpos( get_option( 'permalink_structure' ), '%category%' ), false );
    
    			foreach ( (array) $comments as $comment ) {
    				$output .= '<li class="recentcomments">';
    				$output .= sprintf(
    					/* translators: Comments widget. 1: Comment author, 2: Post link. */
    					_x( '%1$s on %2$s', 'widgets' ),
    					'<span class="comment-author-link">' . get_comment_author_link( $comment ) . '</span>',
    					'<a href="' . esc_url( get_comment_link( $comment ) ) . '">' . get_the_title( $comment->comment_post_ID ) . '</a>'
    				);
    				$output .= '</li>';
    			}
    		}
    		$output .= '</ul>';
    
    		if ( 'html5' === $format ) {
    			$output .= '</nav>';
    		}
    
    		$output .= $args['after_widget'];
    
    		echo $output;
    	}
    • Dieses Thema wurde geändert vor 1 Woche, 6 Tage von iriteser.

    Die Seite, für die ich Hilfe brauche: [Anmelden, um den Link zu sehen]

Ansicht von 1 Antwort (von insgesamt 1)
  • Thread-Ersteller iriteser

    (@iriteser)

    Ich habe noch etwas anderes gefunden, nämlich das Plugin „Comments widget plus“

    Ein bisschen im code gewühlt und da gibt es diese Funktion – habe den Post Status auf private gesetzt und siehe da: die Kommentare werden angezeigt. Aber wie sieht die Syntax aus, um published UND private zu bekommen?

    LG Irit

    function cwp_get_comments($args, $id) {
    
        // Arguments
        $query = array(
            'number'      => $args['limit'],
            'offset'      => $args['offset'],
            'order'       => $args['order'],
            'post_status' => 'private',
            'post_type'   => $args['post_type'],
            'status'      => 'approve'
        );
    
        if ($args['exclude_pings'] == 1) {
            $query['type__not_in'] = array('pings');
        }
    
        // Allow plugins/themes developer to filter the default comment query.
        $query = apply_filters('cwp_comments_args_' . $id, $query);
    
        // Get the comments.
        $comments = get_comments($query);
    
        return $comments;
    }
Ansicht von 1 Antwort (von insgesamt 1)