Thanks, @SuatB! It’s working now. Here’s the correct code:
Gallery Metabox:
// Função para registrar a metabox
function register_custom_metabox() {
add_meta_box(
'custom_gallery_metabox', // ID da metabox
'Image Gallery', // TÃtulo da metabox
'render_custom_metabox', // Função que renderiza a metabox
'post', // Tipo de post onde a metabox será exibida
'normal', // Contexto (onde a metabox será exibida)
'high' // Prioridade
);
}
add_action('add_meta_boxes', 'register_custom_metabox');
// Função para renderizar o conteúdo da metabox
function render_custom_metabox($post) {
// Adiciona o nonce para validação do formulário
wp_nonce_field(basename(__FILE__), 'custom_metabox_nonce');
// Recupera as imagens salvas (IDs)
$gallery_images = get_post_meta($post->ID, 'gallery_images', true);
$gallery_images = is_array($gallery_images) ? $gallery_images : []; // Garantir que seja um array
// Exibe o campo para adicionar imagens
echo '<input type="hidden" id="gallery_images" name="gallery_images" value="' . esc_attr(implode(',', (array) $gallery_images)) . '" />';
echo '<button class="button" id="upload_image_button" style="padding-left: 7px; padding-right: 7px; margin-top: 5px;"><span class="dashicons dashicons-format-gallery" style="display: inline-block; width: 20px; height: 20px; line-height: 1; vertical-align: middle; margin: 0 2px;"></span> Upload Images</button>';
// Exibe as miniaturas das imagens selecionadas
if (!empty($gallery_images)) {
echo '<ul id="gallery_images_list" style="display: flex; flex-wrap: wrap; padding: 0; list-style-type: none; cursor: move;">';
foreach ($gallery_images as $image_id) {
// Obtém a URL da miniatura da imagem
$image_url = wp_get_attachment_image_url($image_id, 'thumbnail');
if ($image_url) {
echo '<li class="gallery-image-item" data-id="' . esc_attr($image_id) . '" style="margin-right: 10px; display: inline-block; cursor: move; text-align: center; width: 150px;">';
echo '<img src="' . esc_url($image_url) . '" style="width: 150px; height: 150px; object-fit: cover;"/>';
echo '<a class="remove-gallery-image" style="cursor: pointer; color: #b32d2e; font-size: 13px; text-decoration: underline; display: block; margin-left: auto; margin-right: auto;">Remove</a>';
echo '</li>';
}
}
echo '</ul>';
}
// Script para o Media Uploader e reordenação com jQuery UI
echo '<script type="text/javascript">
jQuery(document).ready(function($) {
var mediaUploader;
// Função de upload de imagens
$("#upload_image_button").click(function(e) {
e.preventDefault();
if (mediaUploader) {
mediaUploader.open();
return;
}
mediaUploader = wp.media.frames.file_frame = wp.media({
title: "Select Images",
button: { text: "Select Images" },
multiple: true
});
mediaUploader.on("select", function() {
var selection = mediaUploader.state().get("selection");
selection.each(function(attachment) {
var image_ids = $("#gallery_images").val().split(",");
if (image_ids.indexOf(attachment.id.toString()) === -1) {
image_ids.push(attachment.id);
}
$("#gallery_images").val(image_ids.join(","));
});
// Atualiza a lista de imagens no front-end
updateGalleryImages();
});
mediaUploader.open();
});
// Função para atualizar as imagens na galeria
function updateGalleryImages() {
var image_ids = $("#gallery_images").val().split(",");
var gallery_list = $("#gallery_images_list");
gallery_list.empty();
image_ids.forEach(function(image_id) {
var image_url = wp.media.attachment(image_id).get("url");
var html = \'<li class="gallery-image-item" data-id="\' + image_id + \'" style="margin-right: 10px; display: inline-block; cursor: move; text-align: center; width: 150px;">\';
html += \'<img src="\' + image_url + \'" style="width: 150px; height: 150px; object-fit: cover;"/>\';
html += \'<a class="remove-gallery-image" style="cursor: pointer; color: #b32d2e; font-size: 13px; text-decoration: underline; display: block; margin-left: auto; margin-right: auto;">Remove</a>\';
html += \'</li>\';
gallery_list.append(html);
});
}
// Função para remover imagens
$(document).on("click", ".remove-gallery-image", function() {
var image_id = $(this).closest("li").data("id");
var image_ids = $("#gallery_images").val().split(",");
var index = image_ids.indexOf(image_id.toString());
if (index !== -1) {
image_ids.splice(index, 1);
}
$("#gallery_images").val(image_ids.join(","));
$(this).closest("li").remove();
});
// Habilita a reordenação das imagens com o jQuery UI Sortable
$("#gallery_images_list").sortable({
update: function(event, ui) {
var image_ids = [];
$("#gallery_images_list li").each(function() {
image_ids.push($(this).data("id"));
});
$("#gallery_images").val(image_ids.join(","));
}
});
});
</script>';
}```
Show images in Front-End:
function display_gallery_images() {
global $post;
$image_ids = get_post_meta($post->ID, ‘gallery_images’, true);
if (!empty($image_ids)) {
$image_ids = explode(',', $image_ids); // Converte os IDs para um array
$output = '<div class="gallery-container">';
foreach ($image_ids as $image_id) {
$image_url = wp_get_attachment_image_url($image_id, 'full');
$output .= '<div class="gallery-item"><img src="' . esc_url($image_url) . '" alt="Gallery Image"></div>';
}
$output .= '</div>';
return $output;
}
return '<p>No images found</p>';
}
add_shortcode(‘display_gallery’, ‘display_gallery_images’);
Save and order the images:
// Função para salvar as imagens quando o post for salvo
function save_gallery_images($post_id) {
// Verifica o nonce
if (!isset($_POST[‘custom_metabox_nonce’]) || !wp_verify_nonce($_POST[‘custom_metabox_nonce’], basename(FILE))) {
return $post_id;
}
// Verifica se o post está sendo salvo automaticamente (por exemplo, se for um rascunho)
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}
// Verifica se o usuário tem permissão para editar o post
if ('post' != $_POST['post_type'] || !current_user_can('edit_post', $post_id)) {
return $post_id;
}
// Verifica se o campo 'gallery_images' foi enviado e salva os valores
if (isset($_POST['gallery_images'])) {
$gallery_images = sanitize_text_field($_POST['gallery_images']);
$image_ids = explode(',', $gallery_images);
// Garante que somente IDs válidos sejam salvos
$valid_image_ids = array_filter($image_ids, function($id) {
return is_numeric($id) && get_post($id);
});
// Atualiza as imagens associadas ao post
update_post_meta($post_id, 'gallery_images', $valid_image_ids);
}
return $post_id;
}
add_action(‘save_post’, ‘save_gallery_images’);
jQuery UI - Organize the images order:
function load_jquery_ui() {
if (is_admin()) {
wp_enqueue_script(‘jquery-ui-sortable’);
}
}
add_action(‘admin_enqueue_scripts’, ‘load_jquery_ui’);