我对WordPress很陌生,但基本上我想要实现的是将标记的描述作为WordPress 4.5.2自定义主题的必填字段
我已尝试过三种方法,但所有方法都失败了,所以如果有任何WordPress专家可以指导我会很好。
我试图编辑'调用edit_tag_form_fields
和add_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');
<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完成,点击按钮。
functions.php
与方法#1保持一致,但我已经对Javascript明智做出了一些更改,以定位按钮点击事件而不是表单提交事件。
<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处理内置事件。
在添加自己的点击事件之前,我试图从我的按钮取消绑定点击事件。
<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相同。表单仍在提交,但我看到了控制台日志消息。
答案 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
以充分了解我们正在做的事情。
答案 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');