飞流 发表于 2025-10-10 18:29:49

子比主题 – 论坛发帖标签必选功能

这是一款子比论坛的一个功能,就是有很多论坛的人要用到的,有些人喜欢发帖子,但是缺不选择标签,包括用户发帖也不喜欢填写标签,今天腾飞博客给大家分享一个必选标签的功能,喜欢的自行部署吧!


代码部署
将下面的代码放到:/wp-content/themes/zibll/func.php文件里面,如果没有这个文件,记得自己创建一个,记得加上php头,要不然会报错!
/**
* 论坛发帖标签必选功能
* 此功能确保用户在发布论坛帖子时必须选择至少一个标签
*/


function jipan_bbs_tag_required_early_check() {

    if (
      defined('DOING_AJAX') &&
      DOING_AJAX &&
      isset($_REQUEST['action']) &&
      $_REQUEST['action'] === 'bbs_posts_save'
    ) {
      global $zib_bbs;
      
      // 首先检查标题
      $post_title = !empty($_REQUEST['post_title']) ? strip_tags(trim($_REQUEST['post_title'])) : '';
      if (!$post_title) {
            $response = array(
                'error' => 1,
                'msg' => '请填写标题',
                'ys' => 'danger'
            );
            
            header('Content-Type: application/json');
            echo json_encode($response);
            exit;
      }
      
      $title_strlen_limit = _pz('bbs_post_title_strlen_limit') ?: array('min' => 5, 'max' => 30);
      if ($title_strlen_limit['max'] && zib_new_strlen($post_title) > $title_strlen_limit['max']) {
            $response = array(
                'error' => 1,
                'msg' => '标题太长了,不能超过' . $title_strlen_limit['max'] . '个字',
                'ys' => 'danger'
            );
            
            header('Content-Type: application/json');
            echo json_encode($response);
            exit;
      }
      
      if ($title_strlen_limit['min'] && zib_new_strlen($post_title) < $title_strlen_limit['min']) {
            $response = array(
                'error' => 1,
                'msg' => '标题太短!',
                'ys' => 'danger'
            );
            
            header('Content-Type: application/json');
            echo json_encode($response);
            exit;
      }
      
      // 然后检查板块
      $plate = !empty($_REQUEST['plate']) ? (int) $_REQUEST['plate'] : 0;
      if (!$plate) {
            $response = array(
                'error' => 1,
                'msg' => '请选择' . ($zib_bbs ? $zib_bbs->plate_name : '板块'),
                'ys' => 'danger'
            );
            
            header('Content-Type: application/json');
            echo json_encode($response);
            exit;
      }
      
      // 最后检查标签
      $has_valid_tag = false;
      $tag_g = isset($_REQUEST['tag']) ? $_REQUEST['tag'] : array();
      
      if (is_array($tag_g)) {
            foreach ($tag_g as $tag_id) {
                if (!empty($tag_id)) {
                  $has_valid_tag = true;
                  break;
                }
            }
      }
      
      // 如果没有有效标签,返回错误
      if (!$has_valid_tag) {
            $response = array(
                'error' => 1,
                'msg' => '请选择标签',
                'ys' => 'danger'
            );
            
            // 输出JSON响应并结束执行
            header('Content-Type: application/json');
            echo json_encode($response);
            exit;
      }
    }
}

add_action('init', 'jipan_bbs_tag_required_early_check', 1);


function jipan_bbs_required_tag_js() {
    ?>
    <script type="text/javascript">
    jQuery(document).ready(function($) {
      // 添加"(必选)"标记到标签选择器
      function addRequiredLabelToTags() {
            $('.tag-drop').each(function() {
                var $tagDrop = $(this);
                var $tagLabel = $tagDrop.find('.drop-btn .flex.ac').first();
               
                if ($tagLabel.length) {
                  var labelText = $tagLabel.text().trim();
                  if (labelText.indexOf('(必选)') === -1) {
                        // 找到文本节点并在其后添加"(必选)"标记
                        var $icon = $tagLabel.find('i, .fa, .icon, svg').first();
                        if ($icon.length) {
                            // 如果有图标,在图标后面插入必选标记
                            $icon.after('<span class="ml5 mr5 c-red">(必选)</span>');
                        } else {
                            // 在第一个子元素后插入
                            $tagLabel.prepend('<span class="c-red">(必选)</span><span class="mr5"></span>');
                        }
                  }
                }
            });
      }
      

      setTimeout(addRequiredLabelToTags, 500);

      $(document).on('click', '.posts-submit', function(e) {
            // 首先检查标题
            var $form = $('#bbs-posts-edit');
            var $titleInput = $form.find('input');
            var title = $titleInput.val().trim();
            
            if (!title) {
                e.preventDefault();
                e.stopImmediatePropagation();
               
                if (window.notyf) {
                  window.notyf('请填写标题', 'danger');
                } else {
                  alert('请填写标题');
                }
               
                $titleInput.focus();
                return false;
            }
            
            // 然后检查板块
            var $plateInput = $form.find('input');
            var plate = $plateInput.val();
            
            if (!plate) {
                e.preventDefault();
                e.stopImmediatePropagation();
               
                if (window.notyf) {
                  window.notyf('请选择板块', 'danger');
                } else {
                  alert('请选择板块');
                }

                var $plateDrop = $form.find('.plate-drop');
                if ($plateDrop.length) {
                  $('html, body').animate({
                        scrollTop: $plateDrop.offset().top - 100
                  }, 200);
                }
               
                return false;
            }
            
            // 最后检查标签
            var $tagInputs = $form.find('input"]');
            var hasTag = false;
            
            $tagInputs.each(function() {
                if ($(this).val()) {
                  hasTag = true;
                  return false;
                }
            });
            
            if (!hasTag) {
                e.preventDefault();
                e.stopImmediatePropagation();
               
                if (window.notyf) {
                  window.notyf('请选择标签', 'danger');
                } else {
                  alert('请选择标签');
                }
               
                var $tagDrop = $form.find('.tag-drop');
                if ($tagDrop.length) {
                  $('html, body').animate({
                        scrollTop: $tagDrop.offset().top - 100
                  }, 200);
                }
               
                return false;
            }
      });
    });
    </script>
    <?php
}
add_action('wp_footer', 'jipan_bbs_required_tag_js', 99);

页: [1]
查看完整版本: 子比主题 – 论坛发帖标签必选功能