簡體   English   中英

如何將 WordPress 類別選擇限制為一個?

[英]How can I limit WordPress category selection to just one?

我有一個自定義帖子類型和一個自定義分類設置 - 非常標准的東西。

但是,我想知道如何限制我的客戶在每個帖子中選擇多個分類類別?

我不介意他們能夠創建和刪除分類法類型,但我不希望他們選擇多個。 因為這些是復選框,所以它們可以。 也許單選按鈕可以工作?

我已經看到解決方案使用 jQuery 來更改這些字段,但它們似乎有點老套。 執行此操作的最佳實踐方法是什么?

附件是我的自定義分類框的屏幕截圖。

自定義分類

我意識到這不是一個完整的答案,但通過下拉列表列出類別(或分類術語)這樣簡單的事情就可以解決問題。 我個人不知道,但必須有插件才能做到這一點。 沒有冒犯,但這肯定讓我感到困擾,因為之前已經解決了這個問題。

據我所知,我們必須使用jQuery。 這是“hacky”但很容易工作,如果我的記憶很好,那么純PHP / WP解決方案真的很復雜。
這是必要的代碼:

jQuery("#categorychecklist input").each(function(){
    this.type = 'radio';
});

我們必須在/wp-admin/post.php/wp-admin/post-new.php頁面上運行代碼。 它應該在加載時運行,然后在創建新類別時再次運行。 為了解決新的類別問題,我使用了MutationObserver

foreach( array( 'post', 'post-new' ) as $hook )
    add_action( "admin_footer-$hook.php", 'convert_cats_to_radio' );

function convert_cats_to_radio(){
    global $post;
    if( $post->post_type !== 'post') // select your desired Post Type
        return;

    ?>
    <script type="text/javascript">
    function makeRadioButtons(){
        jQuery("#categorychecklist input").each(function(){
            this.type = 'radio';
        });
    }
    function newCategoryObserver(){
        // Example from developer.mozilla.org/en-US/docs/Web/API/MutationObserver
        var targetNode = document.getElementById('categorychecklist');
        var config = { attributes: true, childList: true, subtree: true };
        var callback = function(mutationsList) {
            for(var mutation of mutationsList) {
                if (mutation.type == 'childList') {
                    makeRadioButtons();
                }
            }
        };
        var observer = new MutationObserver(callback);
        observer.observe(targetNode, config);
    }
    newCategoryObserver();
    makeRadioButtons();
    </script>
    <?php
}

相關這個舊插件仍然可以完美地解決子類別層次結構的問題。 默認情況下,在WP中,當選擇一個子類別時,它不會顯示在其父類別下,而是顯示在列表頂部。 它也是一個jQuery解決方案,當時由領先的WP核心開發人員編寫。

這是一個解決方案,以防您需要復選框像單選按鈕一樣工作,但仍然能夠取消選中它們:

(function() {
    // Allow only one selection
    const checkboxes = document.querySelectorAll('[name="tax_input[event-series][]"][type="checkbox"]');
    checkboxes.forEach((item) => {
        item.addEventListener('click', function() {
            checkboxes.forEach((el) => {
                if (item !== el) {
                    el.checked = false;
                }
            });
        });
    });
})();

它遍歷每個復選框並添加一個點擊事件偵聽器。 如果您單擊一個復選框,它將刪除每個元素上的 state 復選框,但它本身。 但是,它仍然保留取消選中某個選項(如果它已被選中)的功能。

我只在管理中添加了腳本。 為此,您可以使用admin_enqueue_scripts

希望這對某人有所幫助::)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM