WordPress 代码实现文章上传多个特色图像
像素鱼丸
08-03
470

WordPress 有时候一篇文章需要上传多个特色图像,常用于产品详情页。使用一下的代码,可以实现在文章编辑页右侧添加一个模块:

功能说明
我们将使用 add_meta_box 和 update_post_meta 手动创建多个“特色图像”字段。你可以上传多张图片,并在前台调用它们。

实现步骤
步骤 1:添加 Meta Box(在 functions.php 中添加)

// 添加多个特色图像 Meta Box
function add_multiple_featured_images_metabox() {
    $post_types = array('post', 'product'); // 支持的文章类型,可以根据需要修改

    foreach ($post_types as $post_type) {
        add_meta_box(
            'multiple-featured-images',
            __('额外特色图像', 'textdomain'),
            'render_multiple_featured_images_metabox',
            $post_type,
            'side',
            'default'
        );
    }
}
add_action('add_meta_boxes', 'add_multiple_featured_images_metabox');

步骤 2:渲染 Meta Box 内容(继续在 `functions.php` 中)

// 渲染 Meta Box 内容
function render_multiple_featured_images_metabox($post) {
    wp_nonce_field('save_multiple_featured_images', 'multiple_featured_images_nonce');

    // 获取已保存的图片 ID 数组
    $image_ids = get_post_meta($post->ID, '_multiple_featured_image_ids', true);
    if (!is_array($image_ids)) $image_ids = array();

    echo '<div id="multiple-featured-images-container" style="margin-top:10px;">';

    foreach ($image_ids as $image_id) {
        $image_url = wp_get_attachment_image_url($image_id, 'thumbnail');
        echo '<div class="image-item" data-id="' . esc_attr($image_id) . '" style="display:inline-block; position:relative; margin:5px;">
                <img src="' . esc_url($image_url) . '" style="width:60px;height:60px;" />
                <a href="#" class="remove-image" style="position:absolute;top:0;right:0;color:red;">&times;</a>
              </div>';
    }

    echo '</div>';

    echo '<a href="#" id="add-multiple-featured-images" class="button">' . __('添加图片', 'textdomain') . '</a>
          <input type="hidden" name="multiple_featured_image_ids" id="multiple_featured_image_ids" value="' . esc_attr(implode(',', $image_ids)) . '" />';
}

步骤 3:保存 Meta Box 数据(继续在 `functions.php` 中)

// 保存数据
function save_multiple_featured_images($post_id) {
    if (!isset($_POST['multiple_featured_images_nonce']) || !wp_verify_nonce($_POST['multiple_featured_images_nonce'], 'save_multiple_featured_images')) {
        return;
    }

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    if (!current_user_can('edit_post', $post_id)) return;

    $image_ids = isset($_POST['multiple_featured_image_ids']) ? explode(',', sanitize_text_field($_POST['multiple_featured_image_ids'])) : array();
    update_post_meta($post_id, '_multiple_featured_image_ids', $image_ids);
}
add_action('save_post', 'save_multiple_featured_images');

步骤 4:加载前端脚本(媒体库支持多图上传)

// 加载媒体库脚本
function enqueue_multiple_featured_images_scripts($hook) {
    global $post_type;

    if ($hook == 'post.php' || $hook == 'post-new.php') {
        if (in_array($post_type, array('post', 'product'))) { // 修改为你想支持的文章类型
            wp_enqueue_media();
            wp_enqueue_script('multiple-featured-images', get_template_directory_uri() . '/js/multiple-featured-images.js', array('jquery'), null, true);
        }
    }
}
add_action('admin_enqueue_scripts', 'enqueue_multiple_featured_images_scripts');

步骤 5:创建 JS 文件 `js/multiple-featured-images.js`

在你的主题目录下新建文件夹 `/js/`,并创建文件 `multiple-featured-images.js`:

jQuery(document).ready(function($) {
    var frame;
    $('#add-multiple-featured-images').on('click', function(event){
        event.preventDefault();

        if (frame) {
            frame.open();
            return;
        }

        frame = wp.media({
            title: '选择图片',
            button: { text: '选择图片' },
            multiple: true
        });

        frame.on('select', function(){
            var attachments = frame.state().get('selection').toJSON();
            var ids = [];

            $('#multiple-featured-images-container').empty();

            $.each(attachments, function(index, attachment){
                var item = $('<div class="image-item" data-id="'+attachment.id+'" style="display:inline-block; position:relative; margin:5px;"><img src="'+attachment.sizes.thumbnail.url+'" style="width:60px;height:60px;" /><a href="#" class="remove-image" style="position:absolute;top:0;right:0;color:red;">&times;</a></div>');
                $('#multiple-featured-images-container').append(item);
                ids.push(attachment.id);
            });

            $('#multiple_featured_image_ids').val(ids.join(','));
        });

        frame.open();
    });

    // 删除图片
    $('#multiple-featured-images-container').on('click', '.remove-image', function(e){
        e.preventDefault();
        $(this).parent().remove();

        var ids = [];
        $('.image-item').each(function(){
            ids.push($(this).attr('data-id'));
        });

        $('#multiple_featured_image_ids').val(ids.join(','));
    });
});

前端调用这些图片的方法

你可以在模板中使用如下代码来显示所有上传的“额外特色图像”:

$image_ids = get_post_meta(get_the_ID(), '_multiple_featured_image_ids', true);
if (is_array($image_ids)) {
    foreach ($image_ids as $image_id) {
        $image_url = wp_get_attachment_image_url($image_id, 'full');
        echo '<img src="' . esc_url($image_url) . '" alt="" style="max-width:100%;margin-bottom:10px;">';
    }
}
收藏
打赏
Mirage 主题"查看更多"一直处在加载中的解决办法
上一篇
WordPress 外观菜单添加自定义字段
下一篇

发表评论

注册不是必须的

像素鱼丸
160 文章
2 评论
4 喜欢
最新文章

VooShop 商城主题

主题简介 Vooshop 是一个简单精美的 WordPress 主题,支持自适应、暗黑模式、多语言等功能,可以用于企业、团体、自由职业者或更广泛的主页。 Vooshop:回归 WooCommerce 的纯粹与极速 零冗余代码,零多余功能。一个完全依赖 WooCommerce 原生能力的轻量级主题。 Vooshop 不做 WooCommerce 做不到的事,我们只负责让它跑得更快。 市面上的主题总试 […]

XZhan 主题

主题简介 XZhan 主题(中文名称:小站主题)是一款 WordPress 企业主题,支持自适应、暗黑模式等功能,可快速构建高质量的企业网站。   主题特色 支持白天与暗黑模式 自适应设计,兼容多种主流浏览器 自定义主色调 LOGO扫光动画 自定义SMTP支持 内置SEO功能 文章支持点赞、分享和海报生成 丰富的小工具 侧边栏粘性滚动 简介的主题设置面板 主题设置可导入和备份 多级子菜单 […]

StarFish 配置框架

一个轻量级的 WordPress 选项框架插件,通过配置化的方式,快速为 WordPress 主题或插件生成后台设置页面。 ✨ 特性 🎯 配置驱动 UI:只需定义数组配置,自动生成完整的表单界面 📱 多页面架构:支持多个独立的设置页面 🎨 丰富的字段类型:包含 15+ 种常用字段类型 🔗 字段依赖系统:实现字段间的联动效果 ✅ 数据验证与清理:自动进行安全清理,防止 XSS 攻击 🚀 零依赖:使用 […]

什么是幽灵按钮

“幽灵按钮”(Ghost Button)是一种常见的网页与移动应用 UI 设计模式,指背景透明(或半透明)、仅通过边框(border)和文字(text)定义的按钮,视觉上“若隐若现”,仿佛“幽灵”一般——因此得名。 核心特征: 无填充色(transparent background) 背景完全透明(或与父容器同色),不遮挡背后内容。 清晰的边框(通常 1–2px 实线) 如 border: 2px […]
生成中...
扫描二维码
扫描二维码
确认购买

您确定要购买此资源吗?

微信扫码支付

请使用微信扫描二维码完成支付

订单号:

等待支付...