WordPress: как я могу получить все вложения комментариев?

#php #wordpress

#php #wordpress

Вопрос:

Выполнив запрос, подобный следующему, я могу получить все вложения post и отобразить их на странице:

 $attachments = get_posts( array(
    'post_type'   => 'attachment',
    'numberposts' => -1,
    'post_status' => null,
    'post_parent' => $post->ID
) );

if ( $attachments ) {
    foreach ( $attachments as $attachment ) {
    ?>
      <li><?php echo wp_get_attachment_image( $attachment->ID, 'full' ); ?>
        <p><?php echo apply_filters( 'the_title', $attachment->post_title ); ?></p>
      </li>
    <?php
  }
}
  

Теперь, если я хочу вместо этого получить все вложения комментариев, как мне это сделать?

Пока это мой запрос комментариев:

     $args = array(
        'status' => 'approve',
        'type' => 'review',
        'number' => $reviews_per_page,
        'offset' => $offset
    );
    
    $comments_query = new WP_Comment_Query;
    $comments = $comments_query->query( $args );
    
    // Comment Loop
    if ( $comments ) {
        echo "<ol>";
        foreach ( $comments as $comment ): ?>
           // stuff to display the comments

           // display image
           <div class="comment-images">
             <li><?php echo wp_get_attachment_image( $comment->comment_ID, 'full' ); ?></li>
           </div>

     <?php endforeach;
      echo "</ol>"; ?>
  

Пожалуйста, не используйте это stuff to display comments в качестве заполнителя в этом фрагменте кода, чтобы он был коротким. Если потребуется, я, конечно, опубликую полный код. Что делает код-заполнитель, он извлекает все тексты комментариев и отображает их на одной странице. Часть, с которой я борюсь, — это добавление изображений, прикрепленных к каждому комментарию вместе с текстом.

Моя цель — отобразить все комментарии на одной странице с соответствующими вложениями изображений (поскольку пользователям разрешено загружать файл изображения со своим комментарием). Но я не уверен, как получить прикрепленные изображения, поскольку wp_get_attachment_image , похоже, работает только с сообщениями. Есть идеи, как я могу это сделать?

Редактировать:

Как вложение добавляется в комментарии WP:

Чтобы добавить вложения к комментарию, я использую бесплатный плагин DCO Comment Attachment. Я просмотрел код. Ниже я приведу части, которые, по моему мнению, имеют отношение к моей попытке.

Внутри DCO_CA_Base класса эта функция получает назначенный идентификатор вложения:

 public function get_attachment_id( $comment_id = 0 ) {
    $meta_key = $this->get_attachment_meta_key();

    if ( ! $comment_id ) {
        $comment_id = get_comment_ID();
    }

    return get_comment_meta( $comment_id, $meta_key, true );
}
  

Это проверяет, есть ли у комментария вложение:

 public function has_attachment( $comment_id = 0 ) {
    if ( ! $comment_id ) {
        $comment_id = get_comment_ID();
    }

    $attachment_id = $this->get_attachment_id( $comment_id );
    if ( ! $attachment_id ) {
        return false;
    }

    // Check the attachment exists.
    if ( ! wp_get_attachment_url( $attachment_id ) ) {
        return false;
    }

    return true;
}
  

И это назначает вложение для комментария:

 public function assign_attachment( $comment_id, $attachment_id ) {
    $meta_key = $this->get_attachment_meta_key();
    return update_comment_meta( $comment_id, $meta_key, $attachment_id );
}
  

Наконец, здесь генерируется HTML-разметка, которая отображает комментарий с прикрепленными к нему изображениями. Использование DCO Comment Attachment в этом коде на самом деле дало мне идею для моей собственной попытки:

 public function get_attachment_preview( $attachment_id ) {
        $url = wp_get_attachment_url( $attachment_id );

        if ( ! $url ) {
            return false;
        }

        $embed_type = $this->get_embed_type( $attachment_id );

        switch ( $embed_type ) {
            case 'image':
                $thumbnail_size = $this->get_option( 'thumbnail_size' );
                if ( is_admin() ) {
                    $thumbnail_size = 'medium';
                }

                $img = DCO Comment Attachment( $attachment_id, $thumbnail_size );
                if ( ! is_admin() amp;amp; $this->get_option( 'link_thumbnail' ) ) {
                    $full_img_url = wp_get_attachment_image_url( $attachment_id, 'full' );
                    $img          = '<a href="' . esc_url( $full_img_url ) . '">' . $img . '</a>';
                }

                $attachment_content = '<p class="dco-attachment dco-image-attachment">' . $img . '</p>';
                break;
            case 'video':
                $attachment_content = '<div class="dco-attachment dco-video-attachment">' . do_shortcode( '' ) . '</div>';
                break;
            case 'audio':
                $attachment_content = '<div class="dco-attachment dco-audio-attachment">' . do_shortcode( '' ) . '</div>';
                break;
            case 'misc':
                $title              = get_the_title( $attachment_id );
                $attachment_content = '<p class="dco-attachment dco-misc-attachment"><a href="' . esc_url( $url ) . '">' . esc_html( $title ) . '</a></p>';
        }

        return $attachment_content;
    }
  

Комментарии:

1. wordpress по умолчанию не предоставляет функцию вложения. Поэтому, пожалуйста, сначала объясните, как вы добавляете вложение в комментарий (предоставьте код) — от этого зависит, как получить вложение спереди

2. Я использую бесплатный плагин DCO Comment Attachment , который предоставляет функцию вложения. Я просмотрел код и добавил некоторые из них в свой пост.

Ответ №1:

Кажется, я понял! 🙂 Я помещаю это здесь на случай, если это поможет другим.

Для завершения: это решение работает с плагином awesome DCO Comment Attachment , который позволяет пользователям добавлять вложения (например, изображения или видео) к своим комментариям.

С помощью кода, опубликованного выше, я отображаю все комментарии на одной странице. При добавлении следующего фрагмента кода изображения, добавленные с помощью плагина, отображаются с соответствующими комментариями.

Я использую get_comment_meta(); для извлечения meta_value имени attachment ID из базы данных. Поле meta_value было добавлено плагином в базу wp_commentmeta данных . Затем я передаю идентификатор вложения в wp_get_attachment_image_url() , который получает URL изображения, прикрепленного к идентификатору вложения.

Теперь это мой код:

 <div class="review-images">
  <?php
  //get meta_key 'attachment_id' and according meta_value from database wp_commentmeta
  //where comment_id == $comment->comment_ID;
    
   $attachment_id = get_comment_meta( $comment->comment_ID, 'attachment_id', true );
   $image_url = wp_get_attachment_image_url( $attachment_id, 'full' );
    
   // output image to screen
   echo '<img loading="lazy" src="' . $image_url . '" alt="attachment image" /> ';
   ?>
</div>