#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>