$conf, $runtime; function_exists('chdir') AND chdir(APP_PATH); $r = 'mysql' == $conf['cache']['type'] ? website_set('runtime', $runtime) : cache_set('runtime', $runtime); } function runtime_truncate() { global $conf; 'mysql' == $conf['cache']['type'] ? website_set('runtime', '') : cache_delete('runtime'); } register_shutdown_function('runtime_save'); ?>How declare Ajax functions ussing SHORTINIT|Programmer puzzle solving
最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

How declare Ajax functions ussing SHORTINIT

matteradmin10PV0评论

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 badges
Add a comment  | 

1 Answer 1

Reset to default 4

Build 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);



}

Articles related to this article

Post a comment

comment list (0)

  1. No comments so far