wordpress不靠插件实现多张Banner替换增删功能

原创 2023-06-27 本文共3929个字,预计耗時10分钟 791次阅读
文章摘要:代码实现,在主题文件functions.php里增加代码: ** 需要有js文件 配合 后台引入 banner.js 不然上传按钮无反应 function load_scripts() { wp_enqueue_script( 'banne...

wordpress不靠插件实现多张Banner替换增删功能

代码实现,在主题文件functions.php里增加代码:

** 需要有js文件 配合 后台引入 banner.js 不然上传按钮无反应

function load_scripts() {
  wp_enqueue_script( 'banner-js', get_template_directory_uri() . '/js/banner.js', array( 'jquery' ), '1.0.0', true ); // 加载自定义的 banner.js 脚本
}
add_action( 'admin_enqueue_scripts', 'load_scripts' );  //后台需要配合js 完成上传

// 注册自定义的 post type  菜单栏里 显示 Banners 项
function register_banner_post_type() {
  register_post_type( 'banner', array(
    'labels' => array(
        'name' => 'Banners',
        'singular_name' => 'Banner',
    ),
    'public' => true,
    'supports' => array( 'title', 'thumbnail' ),
    'menu_icon' => 'dashicons-format-image',
    'rewrite' => array( 'slug' => 'banner' ),
  ));
}
add_action( 'init', 'register_banner_post_type' );

// 添加自定义的 meta box
function banner_meta_box() {
  add_meta_box( 'banner_meta_box', 'Banner Image', 'banner_meta_box_callback', 'banner', 'side', 'high' );
}
add_action( 'add_meta_boxes', 'banner_meta_box' );

// 渲染 meta box 的 HTML
function banner_meta_box_callback( $post ) {
  wp_nonce_field( basename( __FILE__ ), 'banner_meta_box_nonce' );
  $image = get_post_meta( $post->ID, '_banner_image', true );
  if ( $image ) { // 存在使用 数据库里的
      echo '<img src="' . esc_url( $image ) . '" style="max-width: 100%;" />';
  }else{  //  不存在的话 默认  也有空的标签 不然会出现 显示不了图片标签
      echo '<img src="" style="max-width: 100%;" />';
  }
  // 这里的ID 名和banner.js的对应
  echo '<input type="hidden" name="banner_image" id="banner_image" value="' . esc_attr( $image ) . '" />';
  echo '<p><button type="button" class="button button-primary" id="upload_banner_image">Upload Image</button></p>';
  echo '<p><button type="button" class="button" id="remove_banner_image">Remove Image</button></p>';
}

// 保存自定义的 meta box 字段
function save_banner_meta_box( $post_id ) {
  if ( ! isset( $_POST['banner_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['banner_meta_box_nonce'], basename( __FILE__ ) ) ) {
      return;
  }
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
      return;
  }
  if ( isset( $_POST['post_type'] ) && 'banner' == $_POST['post_type'] ) {
      if ( ! current_user_can( 'edit_page', $post_id ) ) {
          return;
      }
  } else {
      if ( ! current_user_can( 'edit_post', $post_id ) ) {
          return;
      }
  }

  if ( isset( $_POST['banner_image'] ) ) {
      $image = sanitize_text_field( $_POST['banner_image'] );
      update_post_meta( $post_id, '_banner_image', $image );
  }
}
add_action( 'save_post', 'save_banner_meta_box' );

上面这个增加完成后,在后台主菜单里,就有个名叫“Banners”的菜单,像发布文章一样,发布图片

新建banner.js,可以也在模板目录里,引用的时候注意路径即可,因为wp的主文件会自带jquery,可以直接使用jquery语法编写,上传功能和删除功能

jQuery(document).ready(function ($) {
    var custom_uploader;
    $('#upload_banner_image').click(function (e) {
        e.preventDefault();
        if (custom_uploader) {
            custom_uploader.open();
            return;
        }
        custom_uploader = wp.media.frames.file_frame = wp.media({
            title: 'Choose Image',
            button: {
                text: 'Choose Image'
            },
            multiple: false
        });
        custom_uploader.on('select', function () {
            var attachment = custom_uploader.state().get('selection').first().toJSON();
            $('#banner_image').val(attachment.url); 
            $('div#banner_meta_box img').attr('src', attachment.url).css('max-width', '100%');
        });
        custom_uploader.open();
    });
    // 删除图片 按钮
    $('#remove_banner_image').click(function (e) {
        e.preventDefault();
        $('#banner_image').val('');
        $('div#banner_meta_box img').attr('src', '');
    });
});

最后在需要调用banner的地方循环调取:

<div id="banner-carousel" class="carousel slide" data-ride="carousel">
    <!-- Wrapper for slides -->
    <div class="carousel-inner">
        <?php
        $query = new WP_Query( array(
            'post_type' => 'banner',
            'posts_per_page' => -1,
        ) );
        $active = true;
        while ( $query->have_posts() ) :
            $query->the_post();
            $image = get_post_meta( get_the_ID(), '_banner_image', true );
            if ( ! $image ) {
                continue;
            }
        ?>
        <div class="item<?php echo $active ? ' active' : ''; ?>">
            <img src="<?php echo esc_url( $image ); ?>" alt="<?php the_title_attribute(); ?>">
            <?php if ( get_the_title() || get_the_content() ) : ?>
            <div class="carousel-caption">
                <?php if ( get_the_title() ) : ?>
                <h3><?php the_title(); ?></h3>
                <?php endif; ?>
                <?php if ( get_the_content() ) : ?>
                <p><?php the_content(); ?></p>
                <?php endif; ?>
            </div>
            <?php endif; ?>
        </div>
        <?php
            $active = false;
        endwhile;
        wp_reset_postdata();
        ?>
    </div>

    <!-- Controls -->
    <a class="left carousel-control" href="#banner-carousel" data-slide="prev">
        <span class="glyphicon glyphicon-chevron-left"></span>
    </a>
    <a class="right carousel-control" href="#banner-carousel" data-slide="next">
        <span class="glyphicon glyphicon-chevron-right"></span>
    </a>
</div>

成功调取到后台设置的多种banner就可以用相应的前端插件实现图片轮播。

版权免责申明
① 本站源码模板等资源SVIP用户永久不限量免费下载
② 所有资源来源于网络收集,如有侵权,请联系站长进行删除处理。
③ 分享目的仅供大家学习和交流,请不要用于商业用途,否则后果自负。
④ 如果你有源码需要出售,可以联系管理详谈。
⑤ 本站提供的源码、模板、插件等等资源,都不包含技术服务请大家谅解。
⑥ 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需。
⑦ 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。
⑧ 网站资源绝不做任何二次加密或添加后门(原版加密除外)
常见问题F&Q
需要积分的资源怎么下载?
您可以注册后签到等活跃动作获得积分,积分可下载,也可充值升级等级免费下载。
源码模板等文件安全吗?有没有后门病毒吗?
站内资源标有“已测试”标签的资源源码,表示已经在本地安装测试调试过才分享出来的,可以保证一定的安全;若不放心可以自行下载模板资源后使用D盾等查杀工具扫一遍确认安全。
本站网站模板等源码提供安装服务吗?
本站资源收集于网络并分享出来共同学习,不提供免费安装服务,模板源码安装等需要有一定熟悉度,小白用户可以下载资源后雇人安装调试。