使自定义POST类型的Metabox完全自动保存和批量/快速编辑兼容

时间:2012-10-30 作者:René Schubert

我正在尝试创建一个自定义的帖子类型,我遇到了与上面描述的相同的问题here; 手动保存时,我的自定义元信息已正确保存,但在autosave ajax至少运行一次后就丢失了。

因此,我现在使用所示的解决方案来解决此问题:

function save_stationinfo($post_id) {
    if((defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) || (defined(\'DOING_AJAX\') && DOING_AJAX) || isset($_REQUEST[\'bulk_edit\'])) return;
    update_post_meta($post_id, \'station_url\', $_POST[\'station_url\']);
    update_post_meta($post_id, \'station_subheadline\', $_POST[\'station_subheadline\']);
    update_post_meta($post_id, \'station_streams\', $_POST[\'station_streams\']);
}
但这会禁用所有自定义元数据的自动保存功能。我真正想要的是使我的metabox与Wordpress的autosave、ajax(但不确定DOING\\u ajax模式的用途)和批量编辑/快速编辑功能完全兼容,以便自动保存自定义元字段,并且我能够将一些字段添加到快速/批量编辑对话框中。

有谁能在这里帮助我,或者告诉我在哪里可以找到这方面的教程吗?(删除if语句在这里没有帮助,因为它当然会让我回到我的第一个问题。)提前感谢!

2 个回复
SO网友:fuxia

WordPress在自动保存期间不发送自定义字段的内容(仅发送标题、段塞和内容)。这就是为什么如果您试图保存数据,自定义字段内容将被删除:您看不到已删除内容和丢失内容之间的区别。

我将为此创建一个单独的autosave函数,因为WordPress处理它的方式可以随时更改,并且没有真正的API。保存的字段是硬编码的,没有任何过滤器:

if ( fullscreen && fullscreen.settings.visible ) {
    post_data["post_title"] = jQuery(\'#wp-fullscreen-title\').val() || \'\';
    post_data["content"] = jQuery("#wp_mce_fullscreen").val() || \'\';
} else {
    post_data["post_title"] = jQuery("#title").val() || \'\';
    post_data["content"] = jQuery("#content").val() || \'\';
}

if ( jQuery(\'#post_name\').val() )
    post_data["post_name"] = jQuery(\'#post_name\').val();
看看wp-admin/includes/ajax-actions.phpwp-includes/js/autosave.js 看看它是如何工作的。

因此,基本上是创建JavaScript文件的副本,删除可以重用的内容,只更改要自动保存的字段。然后将其排队\'autosave\' 在其依赖项列表中。

SO网友:Michael Cannon

另一个想法是检查answer here 带有指向我的自定义批量/快速编辑WordPress插件的链接,以及针对3个自定义字段的自定义帖子类型批量和快速编辑场景的完整要点代码。

要点涉及DOING_AUTOSAVE, 但忽略了直接DOING_AJAX 因为我们希望它无论如何都能起作用。

结束

相关推荐

更改CCTM插件上的默认自定义字段Metabox名称

我找到了这条线Change Default Custom Fields Metabox Name我还想将这个由cctm插件生成的自定义字段头更改为其他内容,所以我尝试添加 global $wp_meta_boxes; add_filter(\'add_meta_boxes\', \'change_meta_box_titles\'); function change_meta_box_titles() { $wp_meta_boxes[\'my_post_type