我有一个自定义页面,我正在使用该页面,用户可以转录存档文档并将其上载到关系数据库(用于历史研究)。
我目前正在尝试添加一个功能,以便他们可以选择他们正在转录的报告的照片(已上载到媒体库),以便在研究人员查看报告时显示。
我跟着https://dobsondev.com/2015/01/23/using-the-wordpress-media-uploader/ 本教程几乎完全复制了代码,除了使用https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/.
我不是在写插件,只是在使用一个自定义页面模板(不管怎样,从曼谷出版社模板修改一个)。问题是,当按钮出现时(我的意思是,这很简单,它只是一个HTML按钮),当我点击它时,什么都不会发生,Wordpress媒体库管理器/添加任何对话框都不会发生(这就是我正在尝试的)
代码如下
/* Add the media uploader script */
function my_media_lib_uploader_enqueue() {
wp_enqueue_media();
wp_register_script( \'media-lib-uploader-js\', plugins_url( \'media-lib-uploader.js\' , __FILE__ ), array(\'jquery\') );
wp_enqueue_script( \'media-lib-uploader-js\' );
}
add_action("wp_ajax_admin_enqueue_scripts", "my_media_lib_uploader_enqueue");
add_action("wp_ajax_nopriv_admin_enqueue_scripts", "my_media_lib_uploader_enqueue");
是我放在函数文件中的内容-不是修改主题文件,而是我编写的用于DB/创建转录接口的函数。
这个我使用的js文件如下
jQuery(document).ready(function($){
var mediaUploader;
$(\'#upload-button\').click(function(e) {
e.preventDefault();
// If the uploader object has already been created, reopen the dialog
if (mediaUploader) {
mediaUploader.open();
return;
}
// Extend the wp.media object
mediaUploader = wp.media.frames.file_frame = wp.media({
title: \'Choose Image\',
button: {
text: \'Choose Image\'
}, multiple: false });
// When a file is selected, grab the URL and set it as the text field\'s value
mediaUploader.on(\'select\', function() {
var attachment = mediaUploader.state().get(\'selection\').first().toJSON();
$(\'#image-url\').val(attachment.url);
});
// Open the uploader dialog
mediaUploader.open();
});
});
下面是我在页面本身中所做的-在演示中,它是以自己的形式-但对我来说,它是现有表单的一部分(这样图像URL可以像所有其他数据一样通过$\\u POST传递到下一个页面,并插入到DB中)。
<input id="image-url" type="text" name="image" />
<input id="upload-button" type="button" class="button" value="Choose Image" />
如果你想看到问题本身,
http://globalmaritimehistory.com/adm-8-database-project/adm-8-report-transcription-interface/ 如果单击“选择报告类型”(使用部署报告),则为链接-(此页面很好)-并且底部是“选择图像”按钮-这是不起作用的部分。
我非常感谢您的帮助。
SO网友:Tom J Nowell
我认为这里对浏览器页面请求的工作方式以及PHP如何加载和运行WordPress存在误解
当您向WordPress发出请求时,PHP加载WordPress并处理页面,然后将其全部清理并丢弃。与Java或Python等其他平台不同,后台没有持续运行的程序。每个请求从头开始加载WordPress。要将内容转到下一个请求,必须将内容保存在数据库或文件系统中。
浏览器请求也是如此。您的浏览器向服务器发送HTTP请求,然后生成HTML文档并将其发回。
这将引导我们找到您的代码。AJAX请求是由浏览器发送的另一个请求,它从头开始加载WordPress。它无法返回到以前请求添加媒体库时修改脚本和样式的时间。
要使enquing脚本工作,您需要在生成页面的同一请求上执行该操作,并且该页面需要调用wp_head
. 因此,它永远无法在AJAX请求上完成,因为没有用于打印标签的标头。
TLDR: You can\'t use AJAX queries to enqueue scripts and styles, that\'s not how it works, and you can\'t use AJAX to change what happened in PHP on a previous request
如果您想在页面上对这些内容进行排队,则需要在主题中,在适当的挂钩上,而不是在管理AJAX处理程序中进行排队。在您正在学习的教程中有一个这样的示例,可以按原样复制粘贴,请记住,您将找到的所有教程都假定您希望在WP Admin中执行此操作,而不是在前端