如何制作标签说明

Chi*_*ung 7 javascript php forms wordpress jquery

我对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');
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

即使说明字段为空,表单也在提交,最重要的是,事件监听器内的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>
Run Code Online (Sandbox Code Playgroud)

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

请输入说明......

我的理论是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>
Run Code Online (Sandbox Code Playgroud)

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

Min*_*Tri 2

编辑标签

编辑标签时,WordPress 会调用wp_update_term. 但是没有过滤器或 AJAX 调用,因此我们必须使用get_term()is 调用的wp_update_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);
Run Code Online (Sandbox Code Playgroud)

我们还需要更新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;
});
Run Code Online (Sandbox Code Playgroud)

因为 WordPress对通知消息进行了硬编码 div,所以我使用内联 css 使错误看起来像警告。将其更改为您的偏好。


添加新标签

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);
Run Code Online (Sandbox Code Playgroud)

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

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

演示:

在此输入图像描述