I try to use SHORTINIT
in my wordpress to do Ajax more fast, but I try to declare my functions and don't return any value.
My code is:
define('SHORTINIT',true);
require_once ('../../../../wp-load.php');
require_once ('../../../../wp-config.php');
function muestraMensaje_callback(){
echo "hola que tal";
die();
}
add_action('wp_ajax_muestraMensaje', 'muestraMensaje_callback');
add_action('wp_ajax_nopriv_muestraMensaje', 'muestraMensaje_callback');
And in my functions I've this code:
/*
* Ajaxs function
*/
add_action('init','registraAjax');
function registraAjax(){
wp_register_script('miScript', get_bloginfo('stylesheet_directory').'/js/ajax.js');
//$miUrl=array('url'=>admin_url('admin-ajax.php'));
$miUrl=array('url'=>get_bloginfo('stylesheet_directory').'/myAjax/ajax.php');
wp_localize_script(miScript, 'MyAjax', $miUrl);
wp_enqueue_script('miScript',get_bloginfo('stylessheet_directory').'/js/ajax.js');
}
What can be the problem? If I called to my muestraMensaje
I didn't have any value.
Edit:
Now I've a new problem: give me the error:
Fatal error: Call to a member function main() on a non-object...line 873
I looking for the solution but everybody said this error is for not include wp-load.php but I've include this file....
I try to use SHORTINIT
in my wordpress to do Ajax more fast, but I try to declare my functions and don't return any value.
My code is:
define('SHORTINIT',true);
require_once ('../../../../wp-load.php');
require_once ('../../../../wp-config.php');
function muestraMensaje_callback(){
echo "hola que tal";
die();
}
add_action('wp_ajax_muestraMensaje', 'muestraMensaje_callback');
add_action('wp_ajax_nopriv_muestraMensaje', 'muestraMensaje_callback');
And in my functions I've this code:
/*
* Ajaxs function
*/
add_action('init','registraAjax');
function registraAjax(){
wp_register_script('miScript', get_bloginfo('stylesheet_directory').'/js/ajax.js');
//$miUrl=array('url'=>admin_url('admin-ajax.php'));
$miUrl=array('url'=>get_bloginfo('stylesheet_directory').'/myAjax/ajax.php');
wp_localize_script(miScript, 'MyAjax', $miUrl);
wp_enqueue_script('miScript',get_bloginfo('stylessheet_directory').'/js/ajax.js');
}
What can be the problem? If I called to my muestraMensaje
I didn't have any value.
Edit:
Now I've a new problem: give me the error:
Fatal error: Call to a member function main() on a non-object...line 873
I looking for the solution but everybody said this error is for not include wp-load.php but I've include this file....
Share Improve this question edited Dec 27, 2018 at 15:22 Eje 1654 bronze badges asked Dec 22, 2014 at 16:53 MarcosMarcos 1872 silver badges12 bronze badges1 Answer
Reset to default 4Build the PHP script that will handle the ajax resquest and send the ajax request directly to that filet (not to wp-admin/admin-ajax.php). In that file, first define SHORTINIT
, then load WordPress manually and finally handle the ajax request.
define('SHORTINIT',true);
//IMPORTANT: Change with the correct path to wp-load.php in your installation
require_once ('../../../../wp-load.php');
//Load any WordPress module you may need from the include folder
//For exmaple:
//require( ABSPATH . WPINC . '/meta.php' );
//require( ABSPATH . WPINC . '/post.php' );
muestraMensaje();
function muestraMensaje(){
echo "hola que tal";
die();
}
Suppose you have named that file ajax.php and that it is in located in the URL mysite/wp-content/plugins/a-plugin/ajax.php. The, the javascript should be something like:
$.ajax({
url: "http://mysite/wp-content/plugins/a-plugin/ajax.php",
})
.done(function( data ) {
alert(data);
});
In the next example I use these WordPress functions: upadate_post_meta
, get_post_custom
, wp_send_json_success
and wp_send_json_error
. This modules are needed:
- load.php: always needed to load WordPress
- formatting.php: it contains sanitizing functions used by
upadate_post_meta
- meta.php: it contains functions related with post meta data and custom fields
- post.php and revision.php: these modules contains post related functions needed when updating post data.
So, this is the PHP script:
define('SHORTINIT', true);
//IMPORTANT: Change with the correct path to wp-load.php in your installation
require( '../../../wp-load.php' );
require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/meta.php' );
require( ABSPATH . WPINC . '/post.php' );
require( ABSPATH . WPINC . '/revision.php' );
cyb_uptdate_hits();
function cyb_uptdate_hits(){
if( isset($_GET['postID']) ) {
$post_id = intval( $_GET['postID']);
if( $post_id > 0 ) {
$get_meta = get_post_custom($post_id);
if( isset($get_meta['hits'][0]) ) {
$prev = intval($get_meta['hits'][0]);
} else {
$prev = 0;
}
update_post_meta($post_id, 'hits', $prev + 1);
$res = array('postID' => $post_id, 'hits' => $prev + 1);
wp_send_json_success($res);
} else {
wp_send_json_error('No post to update.');
}
} else {
wp_send_json_error('No post to update.');
}
die('You die!');
}
This is the javascript I'm using:
(function($){
$(document).ready(function(){
//Update post hits counter
if( typeof cyb_hits_data.postID !== 'undefined' && cyb_hits_data.postID != "0") {
var update_hits = function(post_id){
$.getJSON(cyb_hits_data.ajax_url,{
postID : post_id
});
}
update_hits(cyb_hits_data.postID);
}
});
})(jQuery);
And the enqueue javascript:
add_action( 'wp_enqueue_scripts', 'cyb_hits_enqueue_scripts' );
function cyb_hits_enqueue_scripts() {
wp_register_script('cyb-hits', plugins_url( '/js/hits.js', __FILE__ ), array( 'jquery' ) );
wp_enqueue_script('jquery');
wp_enqueue_script('cyb-hits');
$theID = 0;
if(is_single()) {
$theID = get_the_ID();
}
$scriptData = array(
'ajax_url' => plugins_url( '/ajax_hits.php', __FILE__ ),
'postID' => $theID
);
wp_localize_script('cyb-hits','cyb_hits_data',$scriptData);
}