You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress首页模板元框开发:自定义成就展示选择功能

实现首页成就展示的元框功能

Hey 伙计,我来帮你把这个首页成就展示的元框功能补全。咱们一步步来,让用户既能开关首页成就展示,又能从自定义文章类型capacity_portfolio里挑具体项目。

1. 完成元框的注册与UI渲染

你可以把这段代码加到主题的functions.php里(如果之前已经在front-page.php里写了一部分,整合到这里更规范):

// 注册首页成就设置元框
function capacity_page_add_custom_box() {
    $screens = ['page']; // 只针对页面类型,因为首页是静态页面
    foreach ($screens as $screen) {
        add_meta_box(
            'homepage_achievements_meta', // 元框唯一ID
            '首页成就展示设置', // 元框标题
            'homepage_achievements_meta_box_html', // 渲染内容的回调函数
            $screen,
            'side', // 显示位置:侧边栏
            'default' // 优先级
        );
    }
}
add_action('add_meta_boxes', 'capacity_page_add_custom_box');

// 渲染元框的具体内容
function homepage_achievements_meta_box_html($post) {
    // 安全验证字段
    wp_nonce_field('homepage_achievements_save_meta', 'homepage_achievements_nonce');
    
    // 获取已保存的设置值
    $display_achievements = get_post_meta($post->ID, '_display_homepage_achievements', true);
    $selected_capacity = get_post_meta($post->ID, '_selected_homepage_capacity', true);
    
    ?>
    <p>
        <label for="display_homepage_achievements">
            <input type="checkbox" id="display_homepage_achievements" name="display_homepage_achievements" value="1" <?php checked($display_achievements, '1'); ?>>
            在首页展示成就
        </label>
    </p>

    <!-- 选择项目的容器,默认隐藏,勾选后显示 -->
    <div id="capacity_selection_container" style="<?php echo empty($display_achievements) ? 'display:none;' : ''; ?>">
        <p>
            <label for="selected_homepage_capacity">选择要展示的成就项目:</label><br>
            <select id="selected_homepage_capacity" name="selected_homepage_capacity" style="width:100%;">
                <option value="">-- 请选择项目 --</option>
                <?php
                // 查询所有已发布的capacity_portfolio项目
                $args = [
                    'post_type' => 'capacity_portfolio',
                    'post_status' => 'publish',
                    'posts_per_page' => -1,
                    'orderby' => 'title',
                    'order' => 'ASC'
                ];
                $capacity_posts = new WP_Query($args);
                
                if ($capacity_posts->have_posts()) {
                    while ($capacity_posts->have_posts()) {
                        $capacity_posts->the_post();
                        $selected_attr = selected($selected_capacity, get_the_ID(), false);
                        echo '<option value="' . get_the_ID() . '" ' . $selected_attr . '>' . get_the_title() . '</option>';
                    }
                    wp_reset_postdata(); // 重置查询
                }
                ?>
            </select>
        </p>
    </div>

    <!-- 前端交互:勾选后显示选择框 -->
    <script>
        const toggleCheckbox = document.getElementById('display_homepage_achievements');
        const selectionContainer = document.getElementById('capacity_selection_container');
        
        toggleCheckbox.addEventListener('change', function() {
            selectionContainer.style.display = this.checked ? 'block' : 'none';
        });
    </script>
    <?php
}

2. 保存元框的设置数据

接下来添加保存逻辑,确保用户的选择能被正确存储:

// 保存首页成就设置的元数据
function homepage_achievements_save_meta($post_id) {
    // 验证安全字段
    if (!isset($_POST['homepage_achievements_nonce']) || !wp_verify_nonce($_POST['homepage_achievements_nonce'], 'homepage_achievements_save_meta')) {
        return;
    }
    
    // 跳过自动保存
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    
    // 检查用户编辑权限
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    
    // 保存"是否展示"的开关状态
    $display_value = isset($_POST['display_homepage_achievements']) ? '1' : '0';
    update_post_meta($post_id, '_display_homepage_achievements', $display_value);
    
    // 保存选中的项目ID(只有当开关开启时才保存)
    if ($display_value === '1' && isset($_POST['selected_homepage_capacity'])) {
        update_post_meta($post_id, '_selected_homepage_capacity', sanitize_text_field($_POST['selected_homepage_capacity']));
    } else {
        delete_post_meta($post_id, '_selected_homepage_capacity'); // 开关关闭时清空选中值
    }
}
add_action('save_post', 'homepage_achievements_save_meta');

3. 在首页展示选中的成就

最后,在你的front-page.php里添加展示代码,把选中的成就内容渲染出来:

<?php
// 获取首页的设置数据
$homepage_id = get_option('page_on_front');
$display_achievements = get_post_meta($homepage_id, '_display_homepage_achievements', true);
$selected_capacity_id = get_post_meta($homepage_id, '_selected_homepage_capacity', true);

// 只有当开关开启且选中了有效项目时才展示
if ($display_achievements === '1' && !empty($selected_capacity_id)) {
    $capacity_post = get_post($selected_capacity_id);
    if ($capacity_post && $capacity_post->post_status === 'publish') {
        ?>
        <section class="homepage-achievements-section">
            <h2 class="achievements-title"><?php echo esc_html($capacity_post->post_title); ?></h2>
            <div class="achievements-content">
                <?php echo apply_filters('the_content', $capacity_post->post_content); ?>
                <!-- 如果有特色图片,也展示出来 -->
                <?php if (has_post_thumbnail($selected_capacity_id)): ?>
                    <div class="achievements-image">
                        <?php echo get_the_post_thumbnail($selected_capacity_id, 'large', ['class' => 'img-fluid']); ?>
                    </div>
                <?php endif; ?>
            </div>
        </section>
        <?php
    }
}
?>

额外小提示

  • 如果需要支持选择多个成就项目,把<select>改成<select multiple name="selected_homepage_capacity[]">,然后修改保存逻辑为处理数组(用array_map('sanitize_text_field', $_POST['selected_homepage_capacity'])来过滤)。
  • 记得根据你的主题风格,给展示区域的CSS类名添加对应的样式哦。

内容的提问来源于stack exchange,提问作者user8388657

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:43:23