Estoy tratando de llamar a una función php presionando un botón.
Este es mi código hasta ahora:
echo("<button onclick=\"import_file()\"> Import </button>");El archivo javascript upload.js:
function import_file () { jQuery.ajax({ url: my_ajax_object.ajax_url, data: {action: 'final_save'}, type: "POST", //request type success:function(result){ alert(result); } }); }y la acción en el archivo php primario:
function final_save(){ check_admin_referer('import-upload'); set_time_limit(0); $this->file = $file; $result = $this->save(); if ( is_wp_error( $result ) ){ echo $result->get_error_message(); }else{ echo "Success"; } } add_action('wp_ajax_final_save', 'final_save'); add_action('wp_ajax_no_priv_final_save', 'final_save');También puse en cola los scripts en el mismo archivo:
function enqueue_script(){ $plugins_url = plugins_url(); $base_url = get_option( 'https://www.virtualmin.archives.com' ); $plugins_dir = str_replace( $base_url, ABSPATH, $plugins_url ); $plugin = $plugins_dir.'/really-simple-csv-importer/upload.js'; wp_enqueue_script('js-file', $plugin, array('jquery'), '', false); wp_localize_script( 'js-file', 'my_ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) ); //Load jQuery wp_enqueue_script('jquery'); }y llamando a esta función desde dispatch:
function dispatch() { $this->header(); $this->enqueue_script(); //more code }Despacho siendo llamado aquí:
function really_simple_csv_importer() { load_plugin_textdomain( 'really-simple-csv-importer', false, dirname( plugin_basename(__FILE__) ) . '/languages' ); $rs_csv_importer = new RS_CSV_Importer(); register_importer('csv', __('CSV', 'really-simple-csv-importer'), __('Import posts, categories, tags, custom fields from simple csv file.', 'really-simple-csv-importer'), array ($rs_csv_importer, 'dispatch')); } add_action( 'plugins_loaded', 'really_simple_csv_importer' );Recibo un error admin-ajax.php 400 (Solicitud incorrecta). ¿Alguna idea de qué estoy haciendo mal? Esto está siendo codificado en un complemento.
Me parece recordar haber leído que necesita registrarse, localizar y luego poner en cola el script cuando usa ajax, así que en lugar de
wp_enqueue_script('js-file', $plugin, array('jquery'), '', false); wp_localize_script( 'js-file', 'my_ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );tratar
wp_register_script('js-file', $plugin, array('jquery'), '', false); wp_localize_script( 'js-file', 'my_ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) ); wp_enqueue_script('js-file', $plugin, array('jquery'), '', false);espero que esto ayude
También sé que probablemente este no sea el problema, pero pensé que necesitabas tener wp_die() o morir; siempre en la función que se llama, es decir, final_save
Puedo ver que hay un error tipográfico en su archivo php, así que simplemente reemplace la siguiente línea
add_action('wp_ajax_no_priv_final_save', 'final_save');con el siguiente
add_action('wp_ajax_nopriv_final_save', 'final_save');Espero que esta ayuda para resolver el error.
Además de las respuestas ya dadas por @jtowell, querrá agregar un nonce a su localización y verificar el referente en el backend. Como esto puede resultar confuso la primera vez, recomiendo encarecidamente seguir los pasos de la documentación.
Tutorial general: https://developer.wordpress.org/plugins/javascript/ajax/
Documentos específicos: https://developer.wordpress.org/reference/functions/check_ajax_referer/