我正在尝试编写一个插件,在图像附件中添加一个自定义元字段,为图像提供一个信用字段。我使用“attachment\\u fields\\u to\\u edit”和“attachment\\u fields\\u to\\u save”过滤器。
function hrld_attachment_field_credit( $form_fields, $post ) {
$value = get_post_meta( $post->ID, \'_hrld_media_credit\', true );
$form_fields[\'hrld_media_credit\'][\'label\'] = \'Media Credit\';
$form_fields[\'hrld_media_credit\'][\'input\'] = \'html\';
$form_fields[\'hrld_media_credit\'][\'html\'] = \'<input type="text" class="text hrld_media_credit_input" id="attachments-\'.$post->ID.\'-hrld_media_credit" name="attachments[\'.$post->ID.\'][hrld_media_credit]" value="\'.$value.\'">\';
$form_fields[\'hrld_media_credit\'][\'helps\'] = \'If photo was taken by a Herald photographer, use their username. e.g. "Bucky Badger" You should write "bbadger".\';
return $form_fields;
}
add_filter( \'attachment_fields_to_edit\', \'hrld_attachment_field_credit\', 10, 2 );
上面添加了输入字段。
function hrld_attachment_field_credit_save( $post, $attachment ) {
if( isset( $attachment[\'hrld_media_credit\'] ) )
update_post_meta( $post[\'ID\'], \'_hrld_media_credit\', $attachment[\'hrld_media_credit\'] );
return $post;
}
add_filter( \'attachment_fields_to_save\', \'hrld_attachment_field_credit_save\', 10, 2 );
以上触发保存元数据。
编辑帖子时会出现问题,单击“添加媒体”按钮添加图像。当在此媒体上传器框架内更改图像上的元数据(如标题或alt text)时,wordpress将在文本字段失去焦点时自动保存数据。我的元数据也同样保存,没有问题。我在“image\\u send\\u to\\u editor”中添加了一个过滤器,以便在有信用数据的情况下自动在标题标记中添加信用字段。
function hrld_media_credit_send_editor($html, $id, $caption, $title, $align, $url, $size){
$html = get_image_tag($id, \'\', $title, $align, $size);
$hrld_credit = get_hrld_media_credit($id);
if(isset($hrld_credit) && !empty($hrld_credit)){
if(get_user_by(\'login\', $hrld_credit)){
$hrld_user = get_user_by(\'login\', $hrld_credit);
$html_text = \'<span class="hrld-media-credit">Photo by \'.$hrld_user->display_name.\'.</span>\';
} else{
$html_text = \'<span class="hrld-media-credit">\'.$hrld_credit.\'.</span>\';
}
if($caption){
$html = get_image_tag($id, \'\', $title, $align, $size);
$html .= $html_text;
} else{
$attach_attributes = wp_get_attachment_image_src($id, $isze);
$html = \'[caption id="attachment_\'.$id.\'" align="\'.$align.\'" width="\'.$attach_attributes[1].\'"]\';
$html .= get_image_tag($id, \'\', $title, $align, $size);
$html .= $html_text;
$html .= \'[/caption]\';
}
}
return $html;
}
add_filter( \'image_send_to_editor\', \'hrld_media_credit_send_editor\', 10, 7 );
到目前为止,事情还是如预期的那样顺利。我想要的功能是使用jQuery UI Autocomplete根据用户类型建议用户登录,但我想保持输入字段为自由文本,因为图像信用不必是wordpress中的用户。我使用这个javascript向每个字段添加自动完成功能。
jQuery("body").on("keydown", ".hrld_media_credit_input", function(){
var hrld_media_input = jQuery(this);
hrld_media_input.autocomplete({
source: hrld_user_tags,
select: function (event, ui) {
console.log(hrld_media_input);
hrld_media_input.attr("value", ui.item.value);
}
});
});
我使用的原因。on()是指当使用“添加媒体”按钮时,它会动态创建输入字段,因此不需要。在()上,它将只在页面加载时应用自动完成,而这些输入字段还不存在。(我省略了一些将此脚本排队的php代码,并创建了hrld\\u user\\u tags变量,它只是一个用户名数组)。
现在,当使用autocomplete选择建议的用户名时,单击该名称填充字段,wordpress将不会自动保存该元数据。如果我点击插入帖子,它将不会被放入标题标签中,就像我从未输入用户名一样。但是,如果我在字段中键入并看到“示例”是一个建议,如果我没有单击该建议来自动完成该字段,而是手动键入“示例”,然后按“插入到帖子”,则会保存元数据“示例”,并将其插入到标题标记中。
我已经搜索了几个小时来寻找这个问题的答案,查看了wp includes和wp admin核心文件,试图找到应用过滤器或添加操作以触发保存我的数据的函数,但无法解决这个问题。
对此问题的任何帮助或见解都将不胜感激。