Вопрос или проблема
Я недавно разработал пользовательскую панель для WordPress с пользовательским интерфейсом. На страницах одиночных постов есть слайдер. Я отображаю результаты функции get_attached_media(‘image’) в качестве изображений слайдера.
Я сказал редактору загружать только те изображения, которые он хочет видеть в слайдере, на странице редактирования поста, а остальные изображения загружать через медиа-секцию в боковом меню. Проблема в том, что если пользователь загружает изображение из медиа-экрана, а затем вставляет его в содержимое поста, изображение прикрепляется к этому посту, так как оно не прикреплено ни к одному посту.
Как я могу предотвратить это? Или есть ли способ показать изображения, загруженные со страницы редактирования поста?
Я использую этот код, чтобы загрузить все изображения, которые я загружал через страницу редактирования поста:
function get_gallery_images(){
global $wpdb,$post;
$ids = "";
$counter = 0;
$number_of_posts = 12;
$args = array(
'post_type' => 'attachment',
'numberposts' => 12,
'post_status' => null,
'orderby' => 'rand',
'post_parent' => $post->ID
);
$attachments = get_posts($args);
if ($attachments) {
foreach ($attachments as $attachment) {
if ($counter != 0) {
$ids .= ','.$attachment->ID;
}
else {
$ids .= $attachment->ID;
}
$counter++;
}
}
return $ids;
}
Также эта строка:
$attachment_ids = get_gallery_images();
А также это внутри контентных строк:
echo do_shortcode('');
Эта последняя строка предназначена для отображения изображений в виде галереи, если вам нужно показать их в другом формате, например, в слайдере или карусели, эта строка должна быть изменена в соответствии с вашими потребностями.
Следующий код предоставит очень простой интерфейс. Идея заключается в следующем. На странице редактирования вы получаете еще одну мета-бокс “Слайдер”, где вы можете выбрать, какие прикрепленные медиа будут использоваться для слайдера. Здесь, конечно, можно сделать больше работ по пользовательскому опыту. В данный момент он только показывает уже прикрепленные медиа. Таким образом, редактору нужно добавить медиа, сохранить пост и затем выбрать. Можно сделать некоторые улучшения.
Как только редактор определяет некоторые прикрепленные медиа для слайдера, вы больше не будете использовать get_attached_media('image')
, а вместо этого get_attached_slider()
. В основном, эта функция также выводит объекты постов, но только прикрепленные медиа, которые должны отображаться в слайдере.
Надеюсь, это даст вам старт для того, что вам нужно.
<?php
add_action( 'add_meta_boxes', 'slider_metabox' );
function slider_metabox(){
add_meta_box(
'slider-metabox',
__( 'Slider Pictures', 'sl' ),
'slider_metabox_render',
'post' //Используйте 'post', чтобы отображать на постах, 'page' чтобы отображать на страницах
);
}
/**
* Эта функция отображает мета-бокс
**/
function slider_metabox_render( $post ){
$slider_attachments = get_post_meta( $post->ID, 'slider_attachments', true );
$all_attachments = get_attached_media( 'image', $post->ID );
if( empty( $slider_attachments ) )
$slider_attachments = array();
/*
* Мы получаем наши прикрепленные медиа и медиа, которые уже должны
* быть в слайдере. Мы проходим через все прикрепленные медиа
* выводим чекбокс и если отдельные медиа
* уже для слайдера, мы отмечаем чекбокс
**/
?>
<ul>
<?php foreach( $all_attachments as $s ): ?>
<li data-attachment="<?php echo $s->ID; ?>">
<label for="attachment-<?php echo $s->ID; ?>">
<?php echo wp_get_attachment_image( $s->ID, 'post-thumbnail' ); ?>
</label>
<input id="attachment-<?php echo $s->ID; ?>" type="checkbox" <?php
if( in_array( $s->ID, $slider_attachments ) ):
echo 'checked="checked" ';
endif;
?>name="slider_attachments[]" value="<?php echo $s->ID; ?>" />
</li>
<?php endforeach; ?>
</ul>
<?php
}
/**
* Давайте сохраним нашу медиа для слайдера
**/
add_action( 'save_post', 'slider_attachment_save' );
function slider_attachment_save( $post_id ){
if ( wp_is_post_revision( $post_id ) )
return;
if( isset( $_POST['slider_attachments'] ) )
update_post_meta(
$post_id,
'slider_attachments',
$_POST['slider_attachments']
);
}
/**
* get_attached_slider
* Используйте это вместо get_attached_media(), чтобы получить только изображения слайдера
**/
function get_attached_slider( $post_id = null ){
if( $post_id == null )
$post_id = get_the_ID();
if( !is_numeric( $post_id ) ){
$error = new WP_Error();
$error->add( 'post-id', 'Нет действительного ID поста' );
return $error;
}
$attachment_ids = get_post_meta( $post_id, 'slider_attachments', true );
if( empty( $attachment_ids ) || ! is_array( $attachment_ids ) )
return false;
$args = array(
'post_type' => 'attachment',
'post__in' => $attachment_ids,
'post_status' => 'any',
'posts_per_page' => count( $attachment_ids )
);
$query = new WP_Query( $args );
$attachments = $query->posts;
return $attachments;
}
?>
Дополнительная информация о том, как это реализовать:
Ответ или решение
Как получить только изображения, прикрепленные на странице редактирования поста в WordPress
При разработке интерфейса для редактирования контента в WordPress часто возникает необходимость в контроле над медиафайлами, прикрепленными к постам. В вашем случае, возникла проблема, связанная с тем, что редакторы загружают изображения через экран медиа, которые затем автоматически привязываются к посту. Ниже представлено решение, как оптимизировать этот процесс и обеспечить, чтобы только те изображения, которые были загружены в процессе редактирования поста, использовались в слайдере.
Проблема
Проблема, с которой вы столкнулись, заключается в том, что когда редакторы загружают изображения через экран медиасодержимого и вставляют их в контент поста, эти изображения становятся прикрепленными к этому посту. В результате, когда вы используете функцию get_attached_media('image')
, вы получаете все изображения, прикрепленные к посту, включая те, что не предназначены для слайдера.
Решение
Для решения данной проблемы можно использовать кастомные мета-поля для хранения ID изображений, которые предназначены для слайдера. Это позволит вам управлять выбором изображений более эффективно. Вам потребуется создать метабокс для добавления и выбора изображений, которые должны отображаться в слайдере.
Шаги реализации:
- Создание метабокса для слайдера:
Добавьте следующий код в файл вашей темы functions.php
или в файл вашего плагина:
add_action('add_meta_boxes', 'slider_metabox');
function slider_metabox() {
add_meta_box(
'slider-metabox',
__('Изображения для слайдера', 'sl'),
'slider_metabox_render',
'post'
);
}
function slider_metabox_render($post) {
$slider_attachments = get_post_meta($post->ID, 'slider_attachments', true);
$all_attachments = get_attached_media('image', $post->ID);
if (empty($slider_attachments)) {
$slider_attachments = array();
}
?>
<ul>
<?php foreach ($all_attachments as $s): ?>
<li data-attachment="<?php echo $s->ID; ?>">
<label for="attachment-<?php echo $s->ID; ?>">
<?php echo wp_get_attachment_image($s->ID, 'thumbnail'); ?>
</label>
<input id="attachment-<?php echo $s->ID; ?>" type="checkbox" <?php echo in_array($s->ID, $slider_attachments) ? 'checked="checked"' : ''; ?> name="slider_attachments[]" value="<?php echo $s->ID; ?>" />
</li>
<?php endforeach; ?>
</ul>
<?php
}
- Сохранение выбранных изображений:
Добавьте код для сохранения мета-данных при сохранении поста:
add_action('save_post', 'slider_attachment_save');
function slider_attachment_save($post_id) {
if (wp_is_post_revision($post_id)) {
return;
}
if (isset($_POST['slider_attachments'])) {
update_post_meta($post_id, 'slider_attachments', $_POST['slider_attachments']);
}
}
- Создание функции для получения изображений слайдера:
Создайте функцию, которая будет возвращать только выбранные изображения для слайдера:
function get_attached_slider($post_id = null) {
if ($post_id == null) {
$post_id = get_the_ID();
}
if (!is_numeric($post_id)) {
$error = new WP_Error();
$error->add('post-id', 'Нет действительного идентификатора поста');
return $error;
}
$attachment_ids = get_post_meta($post_id, 'slider_attachments', true);
if (empty($attachment_ids) || !is_array($attachment_ids)) {
return false;
}
$args = array(
'post_type' => 'attachment',
'post__in' => $attachment_ids,
'post_status' => 'any',
'posts_per_page' => count($attachment_ids)
);
$query = new WP_Query($args);
return $query->posts;
}
Как использовать
Замените вызов get_attached_media('image')
на вызов вашей новой функции get_attached_slider()
, чтобы получить только те изображения, которые были выбраны для слайдера.
$attachment_ids = get_attached_slider($post->ID);
Заключение
Данный метод дает вам возможность выбрать и управлять изображениями, используемыми в слайдере поста, без необходимости беспокоиться о том, какие изображения были добавлены через экран медиа. Пользуйтесь мета-полями, чтобы оставаться в курсе и избегать непредвиденных ситуаций при редактировании контента.
Для дальнейшего изучения, обратитесь к официальной документации WordPress по следующим темам:
Следуя указанным шагам, вы сможете успешно контролировать, какие изображения используются в вашем слайдере, обеспечивая более легкий и интуитивно понятный процесс редактирования для ваших редакторов.