如何制作标记说明

时间:2016-05-20 17:28:54

标签: javascript php jquery wordpress forms

我对WordPress很陌生,但基本上我想要实现的是将标记的描述作为WordPress 4.5.2自定义主题的必填字段

我已尝试过三种方法,但所有方法都失败了,所以如果有任何WordPress专家可以指导我会很好。

方法#1

的functions.php

我试图编辑'调用edit_tag_form_fieldsadd_tag_form挂钩时的挂钩,然后通过Javascript修改

function require_category_description(){
    require_once('includes/require_category_description.php');
}
add_action('edit_tag_form_fields', 'require_category_description');
add_action('add_tag_form', 'require_category_description');

require_category_description.php

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            description.parents('form').submit(function(){
                if(description.val().trim().length < 1){
                    console.log('Please enter a description...');
                    return false;
                }
            });
        }
    });
</script>

它没有用,即使说明字段为空,表单仍在提交,最重要的是,事件监听器内的console.log从未发生过。我已经尝试记录描述变量,以确保它进入if情况。因此,我认为表格永远不会提交,而且整个提交内容也是如此。通过Ajax完成,点击按钮。

方法#2

functions.php与方法#1保持一致,但我已经对Javascript明智做出了一些更改,以定位按钮点击事件而不是表单提交事件。

require_category_description.php

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            var button = description.parents('form').find('#submit');

            button.on('click', function(e){
                if(description.val().trim().length < 1)
                    console.log('Please enter a description...');

                e.preventDefault();
                return false;
            });
        }
    });
</script>

然而,表单仍在提交,但这一次,我看到了控制台日志消息。

  

请输入说明...

我的理论是,WordPress会在事件发生之前将事件绑定到按钮的单击,因此在进入我的自定义点击事件之前,它会使用Ajax处理内置事件。

方法#3

require_category_description.php

在添加自己的点击事件之前,我试图从我的按钮取消绑定点击事件。

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            var button = description.parents('form').find('#submit');
            button.unbind('click');

            button.on('click', function(e){
                if(description.val().trim().length < 1)
                    console.log('Please enter a description...');

                e.preventDefault();
                return false;
            });
        }
    });
</script>

结果与方法#2相同。表单仍在提交,但我看到了控制台日志消息。

2 个答案:

答案 0 :(得分:2)

修改代码

编辑标签时,WordPress会调用wp_update_term。但是没有过滤器或AJAX调用,因此我们必须使用wp_update_term()调用的get_term()

add_filter('get_post_tag', function($term, $tax)
{
    if ( isset($_POST['description']) && empty($_POST['description']) ) {
        return new \WP_Error('empty_term_name', __('Tag description cannot be empty!', 'text-domain'));
    } else {
        return $term;
    }
}, -1, 2);

我们还需要更新term_updated_message以明确错误:

add_filter('term_updated_messages', function($messages)
{
    $messages['post_tag'][5] = sprintf('<span style="color:#dc3232">%s</span>', __('Tag description cannot be empty!', 'text-domain'));
    return $messages;
});

因为WordPress hardcoded the notice message div,我使用内联css使错误看起来像一个waring。根据您的喜好进行更改。

添加新标记

AJAX请求调用wp_insert_term,因此我们可以使用pre_insert_term过滤器。在functions.php

中试试这个
add_filter('pre_insert_term', function($term, $tax)
{
    if ( ('post_tag' === $tax) && isset($_POST['description']) && empty($_POST['description']) ) {
        return new \WP_Error('empty_term_name', __('Tag description cannot be empty!', 'text-domain'));
    } else {
        return $term;
    }
}, -1, 2);

在这里,我使用内置的empty_term_name错误来显示通知消息,但您应该注册自己的消息。

另外,请查看wp_ajax_add_tag以充分了解我们正在做的事情。

演示:

enter image description here

答案 1 :(得分:0)

这是Ajax所以你不能依赖submit事件,这是一个解决方案,你可以做什么。

您要做的就是将form-required类包含在特定元素的父标记中,但是它有一些优势。他们的validateForm只检查input上没有textarea的标签,所以我实施了一个想法,它有效。

试试这个

function put_admin_script() { ?>
<script>

    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if( !description ) { 
            description = jQuery('#description'); 
        }   
        if( description ) {
            description.after( $('<p style="visibility:hidden;" class="form-field form-required term-description-wrap"><input type="text" id="hidden-tag-desc" aria-required="true" value="" /></p>') );    
        }   
        description.keyup(function(){
            $("#hidden-tag-desc").val( $(this).val() ); 
        });

        jQuery("#addtag #submit").click(function(){
            console.log("Not empty"+description.val().trim().length);
            if( description.val().trim().length < 1 ) {
                description.css( "border", "solid 1px #dc3232" );
            } else {
                description.css( "border", "solid 1px #dddddd" );
            }                   
        }); 
    }); 

</script>
<?php 
}
add_action('admin_footer','put_admin_script');