在 Wordpress 中,如何将帖子限制为仅一个类别复选框?

Posted

技术标签:

【中文标题】在 Wordpress 中,如何将帖子限制为仅一个类别复选框?【英文标题】:In Wordpress, how to restrict posts to only one category checkbox? 【发布时间】:2012-10-08 06:29:58 【问题描述】:

发帖时,我希望用户只能选择一个类别。我怎样才能实现这样的目标?

对不起,我应该更清楚。在选中复选框以选择帖子将进入的类别时,我希望它充当单选按钮,您可以在其中仅选择一个选项。

jQuery 可以快速解决这个问题,并在网上找到了 jquery 以下代码,我正在尝试找出将其添加到 post.php 头标签的位置:

var $t = jQuery.noConflict();
$t(document).ready(function()    
  $t('#categorychecklist li input[type="checkbox"]').each(function()
    $t(this).change(function()
        //alert( $t('#categorychecklist li input[checked="checked"]').parent().html() );
        $t('#categorychecklist li input').attr('checked','');
        $t(this).attr('checked','checked');
    )
  )
);

【问题讨论】:

如果你想得到答案,你需要更多的信息。 我的意思是我想将用户限制在一个类别(红色小部件或蓝色小部件,而不是两者)。我不知道从哪里开始。也许我可以得到一些指示...... 我花了 45 秒才找到这个:wordpress.org/extend/plugins/members-category 那么,您只想选择一 (1) 个类别——您通常在单选按钮组中看到的那种行为? 【参考方案1】:

我尝试使用许多建议的单选按钮插件,但它破坏了 ACF 的任何功能,因此保留复选框是必不可少的。

在我的示例中,大部分代码改编自 jQuery checkbox change and click event 和 Make parent categories not selectable

在我的 functions.php 中,我为 admin_footer-postadmin_footer-post-new 添加了操作(否则新帖子不会受到影响)。我相信您可以将其添加到标题中,但不要忘记使用 .ready() 更新 jquery

无论如何,代码非常简单:如果是帖子,则在更改类别复选框时删除所有选中并应用单击的检查。

add_action( 'admin_footer-post.php', 'only_allow_one_checkbox' );
add_action( 'admin_footer-post-new.php', 'only_allow_one_checkbox' );

function only_allow_one_checkbox()

    global $post_type;

    if ( 'post' != $post_type )
        return;
    ?>
        <script type="text/javascript">
            $('#categorychecklist>li>label input').change(function() 
                if(this.checked) 
                    $('#categorychecklist>li>label input').prop("checked", false);
                    $(this).prop("checked", true);
                
            );
        </script>
    <?php

到目前为止,它很容易实现并且没有遇到任何问题。

【讨论】:

【参考方案2】:

因此,假设您想要选择一个并且恰好选择一个类别,我会考虑将输入输出类型从复选框更改为单选按钮。您可以做到这一点,而不会使管理区域的&lt;head /&gt; 变得更乱。以下是您可以添加到函数文件中的几种方法:

/**
 * Add scripts (JavaScript, etc.) to the admin area
 */
public function addAdminScripts()

    if( is_admin() )
    
        wp_register_script( 'your-script-id', get_template_directory() . '/inc/javascript/jquery.script.name.js', array( 'jquery' ) );
        wp_enqueue_script( 'your-script-id' );
    


/**
 * Add CSS files to the admin area
 */
public function addAdminStyles()

    if( is_admin() )
    
        wp_enqueue_style( 'your-css-id' );
        wp_enqueue_style( 'your-css-id', get_template_directory(). '/inc/css/your_custom_base.css' );
    

条件is_admin() 将确保文件仅包含在管理区域中,您可以扩展条件以专门检查发布/编辑屏幕。这确保您可以包含主题目录中的 js/css 文件(或者,如果您将其包装在插件中,则可以将其保存到插件目录中)。无论哪种方式,您在管理区域的侵入性都会降低。

现在,就您的实际脚本而言,Alex 有一个良好的开端,但您应该更进一步,将输入类型实际更改为单选按钮,以便继承它们的自然行为,而不是强制复选框像一个单选按钮。这是关于 SO 的相关帖子,这是一个非常好的参考,可以准确地做到这一点how to change an element type using jquery(奖励:所选答案的作者将其包装成一个不错的插件)

【讨论】:

【参考方案3】:

我也在寻找解决此类问题的好方法。本主题显示了一个插件(php)变体,它将类别转换为单选按钮:http://wordpress.org/support/topic/select-only-one-category-1,但它不进行任何类型的验证,因此可以通过 webkit 或 firebug 编辑 html 来操作它(type="radio" => type="checkbox") 并且您可以再次为帖子提供许多类别,并且 js 脚本也容易受到萤火虫的操纵。

编辑:我找到了一个很好的解决方案,可以将类别(和任何其他分类)变成一个不能被欺骗的下拉列表: http://wordpress.org/extend/plugins/acategory-dropdown-list/

@dpassage 我似乎无法评论

【讨论】:

这并不能真正回答问题,因此作为评论可能更好。【参考方案4】:

为什么不把它像这样放在functions.php中;在管理区注册?

//All the rest of your php stuff above ^^
add_action( 'admin_head', 'jquery_for_categories' );

function jquery_for_categories() ?>
    <script type="text/javascript">
      var $t = jQuery.noConflict();
      $t(document).ready(function()    
        $t('#categorychecklist li input[type="checkbox"]').each(function()
          $t(this).change(function()
            //alert( $t('#categorychecklist li input[checked="checked"]').parent().html() );
            $t('#categorychecklist li input').attr('checked','');
            $t(this).attr('checked','checked');
          )
        )
      );
    </script>
 <?

【讨论】:

以上是关于在 Wordpress 中,如何将帖子限制为仅一个类别复选框?的主要内容,如果未能解决你的问题,请参考以下文章

将 WordPress Rest API 请求限制到我的域

如何将文本字段限制为仅有效的小数?

如何将查找和替换限制为仅 CSV 中的一列?

如何将 touchesBegan 和 touchesEnded 限制为仅一次触摸?

如何将输入限制为仅接受数字?

将 Vue for 循环的结果限制为仅当前使用的结果