HEX
Server: nginx/1.28.1
System: Linux iZgw8b5bpgd4jyptfmmmxgZ 6.6.102-5.2.alnx4.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Nov 27 23:11:10 CST 2025 x86_64
User: www (1000)
PHP: 8.2.28
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/www.scdc-marine.com/wp-content/themes/scdc-marine/HekuClass/Admin/Cmb2Post.php
<?php

namespace Heku\HekuClass\Admin;

/**
 * @package     Heku\HekuClass\Admin
 * @subpackage  Classes/Cmb2Post
 * @author      Heku Daleconan <http://www.daleconan.com>
 * @copyright   Copyright (c) 2022-2023, Heku Daleconan
 * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 */


class Cmb2Post {

    /** 
     * 类实现单例模式,类的独生子女
     */
    private static $instance;

    /**
     * 依赖注入的接口 Instance 方法
     * 目标是 保证 init() 初始化方法 只执行一次
     *
     * @return self  唯一实例化的本类
     */
    public static function instance() {
        if ( ! isset( self::$instance ) ) {
            self::$instance = new self;
            self::$instance->init();
        }
        return self::$instance;
    }

    private function init() {

        add_action( 'cmb2_admin_init', array($this,'cmb2_post_metabox'));
        add_action( 'edit_form_after_title', array( $this, 'edit_form_after_title' ) );
        add_action( 'edit_form_after_editor', array( $this, 'edit_form_after_editor' ) );

    }

    public function cmb2_post_metabox() {
     
        // 产品轮播图 设置

            $post_metabox = new_cmb2_box(array( 
                'id'            => 'post_after_title_metabox',
                'option_key'    => 'heku_post_main',
                'object_types'  => array( 'post'),
                'context'       => 'after_title',
                'remove_box_wrap' => true,
            ));

            $post_metabox->add_field( array(
                'before_row'=>'<div id="product_img_div">',
                'name' => '产品 轮播图片 + 第一张非视频图片,将默认为缩略图',
                'desc' => '产品轮播图片,点击编辑特殊字段,可以填写视频链接,将调用为视频播放,图片尺寸建议1:1 ,尺寸建议800 X 800像素,点击图片可放大图片; 调用ID: product_imgs',
                'id'   => 'product_imgs',
                'type' => 'file_list',
                'preview_size' => array( 100, 100 ),
                'text' => array(
                    'add_upload_files_text' => '添加产品图片',
                    'remove_image_text' => '删除图片',
                    'file_text' => '文件:',
                    'file_download_text' => '下载文件',
                    'remove_text' => '删除',
                ),
                //'after_row'=>'</div>'
            ) );

        // 产品轮播图 设置

        // 产品 全屏图文展示 方案一 设置 开始

            $dispaly_group = $post_metabox->add_field( array(
                //'before_row'=>'<div id="product_parameter_div"> <div class="cmb-row-2">',
                'id'          => 'full_display_fliter_group',
                'type'        => 'group',
                'show_on_cb' => function( $cmb ) { $status =  heku_get_option( 'template_main', 'fliter_group2' );  return '1' === '1';  },
                'options'     => array(
                    'group_title'       => __( '筛选{#}', 'heku' ), 
                    'add_button'        => __( '添加新 全屏图文展示页 ', 'heku' ),
                    'remove_button'     => __( '删除 全屏图文展示页 ', 'heku' ),
                    'sortable'          => true,
                    'closed'         => true, 
                    'remove_confirm' => __( '确定要删除这个全屏图文展示页吗?', 'heku' ), 
                ),
                'description' => sprintf( __( ' 全屏图文展示页 + 排版格式 <p> 注意拖动时候,列表第一个的排序修改是无效的,无法保存,请展开,使用内置的下移按钮修改排序。 %s </p>', 'heku' ),'<span class="heku-debug"> 分组ID:<code> full_display_fliter_group </code> </span> ' ),
                'after_group'=>'</div>',
            ));

            $post_metabox->add_group_field( $dispaly_group ,array(
                'name'  => sprintf(__(' 全屏图文展示页的简称 %s','heku'),'<span class="red">(必填)</span>'),
                'id'    => 'title',
                'type'  => 'text',
                'desc'  => __('给这个全屏图文展示页起个名字','heku'),
                'attributes' => array(
                    'required' => 'required',
                ),
            ));

            $slider = apply_filters('heku_admin_full_display_slider_settings', array(
                'options'=>array(
                    'product_introduction' => __('产品简介 图文排版 product_introduction','heku'), 
                    'product_parameters' => __('产品简介 图文排版 product_parameters','heku'),
                    'single_banner-3' => __('单页 Banner 图片 新闻','heku'), 
                    'single_banner-4' => __('单页小 Banner 图片','heku'),
                ),
                'images'       => array(
                    'product_introduction' => '/Assets/admin/images/index-group/product_introduction.png',
                    'product_parameters' => '/Assets/admin/images/index-group/product_parameters.png',
                    'single_banner-3' => '/Assets/admin/images/slider-4.svg',
                    'single_banner-4' => '/Assets/admin/images/slider-5.svg',
                )
            )); 

            $post_metabox->add_group_field( $dispaly_group, array(
                'name'  => __( '全屏 图文展示的样式 ', 'heku' ),
                'id'    => 'slider_type',
                'type'  => 'radio_image',
                'classes'   => 'model-picked',
                'options'   => $slider['options'],
                'images_path'   => HEKU_THEME_URI,
                'images'    => $slider['images'],
                'default'   => 'slider-1'
            ));

            $post_metabox->add_group_field( $dispaly_group,array(
                'before_row'=>'<div class="cmb-row ">',
                'name'=>'图文 主标题 【a】',
                'id'=>'title_a',
                'type'    => 'text',
                'default' => '',
                'desc'=>__('根据 Banner 图片的轮播样式,具体调用展示不同数量的文字1。<span class="heku-debug"> 字段ID:<code> index_title_a </code> </span>', 'heku'),
                'after_row'=>'</div>',
            ));
            
            $post_metabox->add_group_field( $dispaly_group,array(
                'before_row'=>'<div class="cmb-row ">',
                'name'=>' 图文 副标题或描述 【b】',
                'id'=>'title_b',
                'type'    => 'text',
                'default' => '',
                'desc'=>__('根据 Banner 图片的轮播样式,具体调用展示不同数量的文字1。<span class="heku-debug"> 字段ID:<code> index_title_b </code> </span>', 'heku'),
                'after_row'=>'</div>',
            ));
            
            $post_metabox->add_group_field( $dispaly_group, array(
                'before_row'=>'<div class="product_introduction-module cmb-row set-hidden">',
                'name'    => __( '前景图片(产品', 'heku' ),
                'desc'    => __( '某些 展示样式下使用,建议使用<code> image/png </code> 的透明图片,以适应展示需求。<span class="heku-debug"> 字段ID:<code> index_primg1 </code> </span>', 'heku' ),
                'id'      => 'primg1',
                'type'    => 'file',
                'options' => array(
                    'url' => true, 
                ),
                'text'    => array(
                    'add_upload_file_text' => __( '选择 Banner 图片', 'b2' ),
                ),
                'query_args' => array(
                    'type' => array(
                        'image/svg+xml',
                        'image/gif',
                        'image/jpeg',
                        'image/png',
                    ),
                ), 
                'after_row'=>'</div>',
            ));

            // 富文本 文字简单聚合  开始

                $post_metabox->add_group_field( $dispaly_group, array(
                    'before_row'=>'<div class="product_introduction-module product_parameters-module  cmb-row set-hidden">',
                    'name'    => '富文本 文字简单聚合【c】',
                    'desc'    => 'div 标签 中可以保存class 类名,配合展示css需要,保存前需要预览,防止出现排版错误。<span class="heku-debug"> 字段ID:<code> index_textarea_c </code> </span>',
                    'id'      => 'textarea_c',
                    'type'    => 'wysiwyg',
                    'options' => array(
                        'wpautop' => false, // use wpautop?
                        'media_buttons' => true, // show insert/upload button(s)
                        'tabindex' => '',
                        'editor_css' => '', // intended for extra styles for both visual and HTML editors buttons, needs to include the `<style>` tags, can use "scoped".
                        'editor_class' => '', // add extra class(es) to the editor textarea
                        'teeny' => false, // output the minimal editor config used in Press This
                        'dfw' => false, // replace the default fullscreen with DFW (needs specific css)
                        'tinymce' =>  array(
                            'options'	=> 'menubar,advlist,menubar_block,merge_toolbars',
                            'toolbar_1' => 'formatselect',
                            'toolbar_2' => ' ',
                            'toolbar_3' => '',
                            'toolbar_4' => '',            
                            //'toolbar_classic_block' => 'formatselect,bold,italic,blockquote,bullist,numlist,alignleft,aligncenter,link,forecolor,backcolor,table',
                            //'toolbar_block' => 'core/bold,core/italic,core/link,tadv/removeformat',
                            'toolbar_block_side' => 'core/code,tadv/mark,tadv/sup,tadv/sub',
                            'panels_block' => 'tadv/color-panel,tadv/background-color-panel',
                        ), // load TinyMCE, can be used to pass settings directly to TinyMCE using an array()
                        'quicktags' => true // load Quicktags, can be used to pass settings directly to Quicktags using an array()
                    ),
                    'after_row'=>'</div>',
                ));
        
            // 富文本 文字简单聚合   结束

            $post_metabox->add_group_field( $dispaly_group, array(
                'before_row'=>'<div class="news_banner-1-module cmb-row set-hidden">',
                'name'    => '模块的整体背景(颜色)',
                'id'      => 'bg_color',
                'type'    => 'colorpicker',
                'default' => '#ffffff',
                'options' => array(
                    'alpha' => true,
                ),
                'after_row'=>'</div>',    
            ));

            $post_metabox->add_group_field( $dispaly_group, array(
                'before_row'=>'<div class="news_banner-1-module cmb-row set-hidden">',
                'name'    => __( 'Banner 背景(图片)', 'heku' ),
                'id'      => 'bg_img',
                'type'    => 'file',
                'options' => array(
                    'url' => true, 
                ),
                'text'    => array(
                    'add_upload_file_text' => __( '选择 Banner 图片', 'heku' ),
                ),
                'query_args' => array(
                    'type' => array(
                        'image/svg+xml',
                        'image/gif',
                        'image/jpeg',
                        'image/png',
                    ),
                ),
                'desc'    => sprintf(__( ' Banner 图片或是背景,建议使用 %s 格式的图片,以适应高分辨率屏幕。%s ', 'heku' ),'<code>.svg</code>','<span class="heku-debug"> 字段ID:<code> banner_bg_img </code> </span> '),
                'after_row'=>'</div>',
            ));

            $post_metabox->add_group_field( $dispaly_group, array(
                'before_row'=>'<div class="news_banner-1-module cmb-row set-hidden">',
                'name'    => __( 'Banner 背景(视频)', 'heku' ),
                'id'      => 'bg_video',
                'type'    => 'file',
                'options' => array(
                    'url' => true, 
                ),
                'text'    => array(
                    'add_upload_file_text' => __( '选择 Banner 图片', 'heku' ),
                ),
                'query_args' => array(
                    'type' => array(
                        'image/svg+xml',
                        'image/gif',
                        'image/jpeg',
                        'image/png',
                    ),
                ),
                'desc'    => sprintf(__( ' Banner 图片或是背景,建议使用 %s 格式的图片,以适应高分辨率屏幕。%s ', 'heku' ),'<code>.svg</code>','<span class="heku-debug"> 字段ID:<code> banner_bg_video </code> </span> '),
                'after_row'=>'</div>',
            ));

        // 产品 全屏图文展示 方案一 设置 结束
        

        // 产品额外参数 设置

            $post_parameter_metabox = new_cmb2_box(array( 
                'id'            => 'post_after_editor_metabox',
                'object_types'  => array( 'post'), 
                'context'       => 'after_editor',
                'remove_box_wrap' => true,
            ) );

            $post_parameter_metabox->add_field( array(
                'before_row'=>'<div id="product_parameter_div"> <div class="cmb-row-2">',
                'name'    => __( '产品简称(用于列表调用)', 'heku' ),
                'id'      => 'product_small_title',
                'desc'=> __( '建议少于12个字符,留空则调用标题,调用ID:product_small_title', 'heku' ),
                'type'    => 'text',
            ) );
    
            $post_parameter_metabox->add_field( array(
                'name'    => __( '产品型号', 'heku' ),
                'id'      => 'product_model',
                'desc'=> __( '可以填写多个系列型号用 "," 分开,调用ID:product_model', 'heku' ),
                'type'    => 'text',
                'after_row'=>'</div>'
            ) );

            
            $brand_fliter = heku_get_option( 'product_single', 'product_brand_fliter_group' );
            //var_dump($brand_fliter);
            $brand_slider = array();
            foreach( $brand_fliter as $brand ) {
                $brand_slider['options'][$brand['title']] = $brand['title'];
                $brand_slider['images'][$brand['title']] = $brand['brand_img'];
            }

            //var_dump($brand_slider);
            $post_parameter_metabox->add_field( array(
                'name'  => __( '全屏 图文展示的样式 ', 'heku' ),
                'id'    => 'product_brand_slider',
                'type'  => 'radio_image',
                'classes'   => 'model-picked',
                'options'   => $brand_slider['options'],
                'images_path'   => HEKU_HOME_URI,
                'images'    => $brand_slider['images'],
                'default'   => 'slider-1'
            ));

            $post_parameter_metabox->add_field( array(
                'name'    => '首页产品宣传参数',
                'desc'    => '产品参数,最好以列表形式保存,建议在3-4条,没条字数不要超过30个字符。保存前需要预览,防止出现排版错误。',
                'id'      => 'home_parameters',
                'type'    => 'wysiwyg',
                'options' => array(
                    'wpautop' => false, // use wpautop?
                    'media_buttons' => true, // show insert/upload button(s)
                    'tabindex' => '',
                    'editor_css' => '', // intended for extra styles for both visual and HTML editors buttons, needs to include the `<style>` tags, can use "scoped".
                    'editor_class' => '', // add extra class(es) to the editor textarea
                    'teeny' => false, // output the minimal editor config used in Press This
                    'dfw' => false, // replace the default fullscreen with DFW (needs specific css)
                    'tinymce' =>  array(
                        'options'	=> 'menubar,advlist,menubar_block,merge_toolbars',
                        'toolbar_1' => 'formatselect',
                        'toolbar_2' => ' ',
                        'toolbar_3' => '',
                        'toolbar_4' => '',            
                        'toolbar_classic_block' => 'formatselect,bold,italic,blockquote,bullist,numlist,alignleft,aligncenter,alignright,link,forecolor,backcolor,table,wp_help',
                        'toolbar_block' => 'core/bold,core/italic,core/link,tadv/removeformat',
                        'toolbar_block_side' => 'core/code,tadv/mark,tadv/sup,tadv/sub',
                        'panels_block' => 'tadv/color-panel,tadv/background-color-panel',
                    ), // load TinyMCE, can be used to pass settings directly to TinyMCE using an array()
                    'quicktags' => true // load Quicktags, can be used to pass settings directly to Quicktags using an array()
                ),
            ));

            $post_parameter_metabox->add_field( array(
                'before_row'=>'<div class="clear cmb-row"> <h2 style="font-size: 18px;padding-left: 0px;margin-bottom: 0px;">相关新闻和案例</h2>',
                'name'    => __( '不展示', 'heku' ),
                'desc'    => __( '选择相关联的新闻和案例链接,最好有图片,调用ID:product_related_news ', 'heku' ),
                'id'      => 'product_related_news',
                'type'    => 'custom_attached_posts',
                'show_names'        => false,
                'column'  => true, // Output in the admin post-listing as a custom column. https://github.com/CMB2/CMB2/wiki/Field-Parameters#column
                'options' => array(
                    'show_thumbnails' => true, // Show thumbnails on the left
                    'filter_boxes'    => true, // Show a text box for filtering the results
                    //'query_users'     => true, // Do users instead of posts/custom-post-types.
                    'query_args'      => array(
                        //'posts_per_page' => 10,
                        'post_type'      => array('news'),
                    ),
                ),
                'after_row'=>'</div>'

            ) );


            $post_parameter_metabox->add_field( array(
                'before_row'=>'<div class="clear cmb-row"> <h2 style="font-size: 18px;padding-left: 0px;margin-bottom: 0px;">相关产品展示</h2>',
                'name'    => __( '不展示', 'yourtextdomain' ),
                'desc'    => __( '选择相关联的产品链接,建议不要多余4个,ID: product_hot_post ', 'heku' ),
                'id'      => 'product_hot_post',
                'type'    => 'custom_attached_posts',
                'show_names'        => false,
                //'render_row_cb' => array( $this , 'yourprefix_render_row_cb' ),
                'column'  => true, // Output in the admin post-listing as a custom column. https://github.com/CMB2/CMB2/wiki/Field-Parameters#column
                'options' => array(
                    'show_thumbnails' => true, // Show thumbnails on the left
                    'filter_boxes'    => true, // Show a text box for filtering the results
                    'query_args'      => array(
                        //'posts_per_page' => 10,
                        'post_type'      => array('post'),
                    ),
                ),
                'after_row'=>'</div></div>'
            ) );



        // 产品额外参数 设置

    }

    public function edit_form_after_title() { 
        global $post_type;
        if( 'post' === $post_type ): ?>

            <ul class="edit-detail-tabs">
                <li class="product_div current"><?php echo get_post_type_object($post_type)->labels->singular_name; ?>信息上传</li>
                <li class="product_parameter">显示额外参数</li>
                <li class="tag_seo">SEO参数设置</li>
            </ul>

        <?php endif;
    }

    public function edit_form_after_editor() { 
        global $post_type;
        if( 'post' === $post_type ): ?>

            <div id="product_div_show"></div>
            <div id="product_parameter_show"></div>
            <div id="tag_seo_show"></div>

            <style type="text/css">
                .wp-editor-expand #post-status-info{border: 0px solid #c3c4c7;box-shadow: 2px 4px 4px rgba(0,0,0,0.1);border-bottom-left-radius: 8px;border-bottom-right-radius: 8px;}
                #wp-word-count {padding: 8px 10px;}
                #post-status-info td {font-size: 13px;}
                div.mce-toolbar-grp{padding: 1px;}
                div.mce-toolbar-grp>div {padding: 4px 10px;}
                .wp-editor-expand #wp-content-editor-container{box-shadow: 2px 2px 4px rgba(0,0,0,0.1);border-right: 0px solid #dcdcde;border-left: 0px solid #dcdcde;}
                .wp-editor-expand #wp-content-editor-tools{box-shadow: 2px 0px 4px rgba(0,0,0,0.1);}
                .wp-editor-tabs{padding-right: 20px;}
                #cmb2-metabox-post_after_title_metabox{border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;}
                #post-body-content #cmb2-metabox-post_after_editor_metabox.cmb2-metabox{padding: 0;}
                #product_parameter_div{padding: 1.5em 2em;}
                #post_after_title_metabox{margin-bottom: -60px;}
                #product_img_div{margin-bottom: 60px;}
                .focus-on .wp-header-end{display: none;}

                .cmb2-context-wrap {margin-top: 20px;}
                .cmb2-context-wrap.cmb2-context-wrap-after_title{margin-top: 0px;}
                .cmb2-context-wrap #cmb2-metabox-post_after_title_metabox .cmb-type-group > .cmb-td{width:100%}
                .cmb2-context-wrap .cmb-td{width:100%}
                .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin: 10px 15px 0 0;}
                #postbox-container-1 .postbox {border: 0px solid #c3c4c7; box-shadow: 2px 4px 4px rgba(0,0,0,0.1);}
                #titlediv #title{border: 0px solid #8c8f94;height: 2em;padding: 3px 15px;box-shadow: 2px 4px 4px rgba(0,0,0,0.1);border-radius: 8px;}
                #submitdiv.postbox, .postbox{    border-radius: 8px;}

                .edit-detail-tabs:after{content: "";display: block;clear: both;visibility: hidden;height: 0;}
                .edit-detail-tabs{height: 36px;line-height: 35px;border-bottom: 1px solid #6f6f6f;font-size: 16px;margin: 10px auto 0px;}
                .edit-detail-tabs li{float: left;padding: 0 15px;background: #6f6f6f;border-radius: 8px 8px 0 0;font-size: 12px;margin: 0 20px -2px 0;position: relative;z-index: 22;cursor: pointer;}
                .edit-detail-tabs li,.edit-detail-tabs li a{color: #fff;}
                .edit-detail-tabs li.current{background: #42586f;}
                .edit-detail-tabs li.current,.edit-detail-tabs li.current a{color: #fff;}
                
                #insert-media-button{margin:-6px 6px}
                #aiosp .handlediv,#aiosp h2,#aio-pro-update{display: none;}
                #aiosp .aioseop_wrapper{padding: 10px 13px 0;}
                #aiosp .inside{padding: 0 30px 12px;}
                #aiosp { margin-bottom:0px ;}
                #aiosp .aioseop_option_label ,#aiosp .aioseop_label { line-height: 35px; }
                #aiosp_noindex_wrapper,#aiosp_nofollow_wrapper,#aiosp_disable_wrapper{display: none;}
                .postbox-container div#aiosp_upgrade_wrapper .aioseop_input .aioseop_option_input .aioseop_option_div{padding:0}
                .edit-detail-panel-hide{display: none;}
            </style>

            <script>jQuery(document).ready(function($){
                $('#product_parameter_show').addClass('edit-detail-panel-hide')
                $('#product_parameter_div').addClass('edit-detail-panel-hide')
                $('.edit-detail-tabs li').click(function() {
                    $(this).addClass('current').siblings().removeClass('current')
                    $('#product_div_show,#product_parameter_show,#tag_seo_show,#postdivrich,#product_img_div,#product_parameter_div').addClass('edit-detail-panel-hide')
                    var activeClass = $(this).attr('class').split(" ")[0]
                    var activeCont = '#' + activeClass + '_show'
                    $(activeCont).removeClass('edit-detail-panel-hide')
                })
                $('.product_div').click(function() {
                    $('#tag_seo_show').removeClass('edit-detail-panel-hide')
                    $('#postdivrich').removeClass('edit-detail-panel-hide')
                    $('#product_img_div').removeClass('edit-detail-panel-hide')
                    $(window).scrollTop(100)
                })

                $('.product_parameter').click(function(){
                    $('#product_parameter_div').removeClass('edit-detail-panel-hide')
                })

                $('#aiosp').appendTo('#tag_seo_show')

                $('#tagsdiv-post_tag').appendTo('#tag_seo_keywords')
            })</script>

        <?php endif; 

    }

}