Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I tried ajax to get some info a php inside my plugin.but getting error-call to undefined function. Ajax

jQuery.ajax({
        type: "POST",
        url: "<?php echo plugins_url();?>/tester/inc/test.php",
        data: { param: 'st1' }
      }).done(function( msg ) {
             alert( "Data Saved: " + msg );
     });

Error in alert

Data Saved: <br />
<font size='1'><table class='xdebug-error xe-fatal-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Fatal error: Call to undefined function add_action() in E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php on line <i>7</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0007</td><td bgcolor='#eeeeec' align='right'>254944</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php' bgcolor='#eeeeec'>..\test.php<b>:</b>0</td></tr>
</table></font>

test.php

<?php
function aj()
{
 echo "hello";
echo plugins_url();
}
add_action('wp_ajax_my_action','aj'); 
add_action('wp_ajax_nopriv_myFunction','aj'); 

 ?>

i think the error denote like am not inside wordpress. Any idea?

share|improve this question

3 Answers 3

up vote 0 down vote accepted

Please, avoid the use of require('../../../wp-load.php'); and things like that as suggested in other answers. You should always use the Wordpress AJAX way. It is really easy and you will have all Wordpress engine loaded in your PHP script.

Just three considerations:

  1. You have to send the ajax request to ...wp-admin/admin-ajax.php. ajaxurl is a javascript var that is always defined in the admin area and it contains the correct url to the admin-ajax.php file in the current Wordpress instalation. You can use ajaxurl directly in your javascript in the admin area. I've seen that you send the ajax request to a different URL.
  2. In the sent data you have to inclue the action var. The action var contains the name of a previously registered PHP function by your plugin/theme. This function will handle the ajax request. I've read your code and you defined the ajax function in your PHP but the action is missed in your javascript.
  3. The example bellow is for the admin area as you asked about admin area. In the frontend is a little different but still really easy; if you need a example to make the ajax request in the frontend just say and I will post it.

Example:

In your PHP (plugin/theme):

add_action('wp_ajax_my_action', 'my_ajax_action_function');

function my_ajax_action_function(){

    $reponse = array();
    if(!empty($_POST['param'])){
         $response['response'] = "I've get the param a its value is ".$_POST['param'].' and the plugin url is '.plugins_url();
    } else {
         $response['response'] = "You didn't send the param";
    }

    header( "Content-Type: application/json" );
    echo json_encode($response);

    //Don't forget to always exit in the ajax function.
    exit();

}

Your backend javascript should be something like this (remember that ajaxurl is always defined by Wordpress in the admin area):

jQuery.ajax({
    type: "POST",
    url: ajaxurl,
    data: { action: 'my_action' , param: 'st1' }
  }).done(function( msg ) {
         alert( "Data Saved: " + msg.response );
 });
share|improve this answer
    
I think you have misread @s_ha_dum answer. Your answer is almost identical to the answer he linked. To be honest, and with no offence, your is less complete. –  G. M. Sep 3 '13 at 14:31
    
You are right. I read the Mike Lewek answer and after that I didn't spend enough time to read the s_ha_dum answer. –  cybmeta Sep 3 '13 at 14:39
    
@cybnet thanks in my_ajax_action_function() i removed all code even though am getting an alert of plugin_url.How this is happening i just want to know this –  sun Sep 3 '13 at 14:50
    
plugin_url() dosen't exist in Wordpress, the correct is plugins_url(). See the edited answer, I've added plugins_url() function and it is working perfectly. –  cybmeta Sep 3 '13 at 21:57
    
thanks for your help –  sun Sep 4 '13 at 8:58

You are not in a WordPress context. You've loaded the plugin file directly. That file will load, but not the rest of WordPress.

Use the AJAX API. This is what it was meant for. Don't use hacks that are no longer necessary like require/includeing WordPress Core files (wp-load.php, wp-blog-header.php, wp-settings.php, depending on which "tutorial" you read)

If the examples in the Codex are not enough to get you started, there are numerous examples on this site including 30-something I've written-- this one, in particular, which probably qualifies as one of several "duplicate questions".

share|improve this answer
    
i cant'able to figure out codex or other codes up to my knowledge that is why i posted the question here. SO that others can help me what wrong am making. Anyway Thanks –  sun Sep 4 '13 at 8:58

You are right, because of the way you are making your AJAX call, WordPress is not being loaded. The proper way is to use ajaxurl as the URL, and set your action to be my_action by passing that as the value of the action parameter in your request data:

jQuery.ajax({
    type: "POST",
    url: ajaxurl,
    data: { action: 'my_action', param: 'st1' }
  }).done(function( msg ) {
         alert( "Data Saved: " + msg );
 });

See AJAX in Plugins for more information.

share|improve this answer
    
Why am getting Data Saved: localhost/wp_twentythirteen/wp-content/plugins0 even if i remove plugins_url() in test.php –  sun Sep 3 '13 at 13:49
    
You need to call exit() at the end of your function. Try that and see if this still happens. –  J.D. Sep 3 '13 at 14:18
    
if i use exit() am getting localhost/wp_twentythirteen/wp-content/plugins –  sun Sep 3 '13 at 14:51
    
If you are getting that, then you must be calling plugins_url() somewhere in your code before the call to exit(). –  J.D. Sep 3 '13 at 18:41
    
Thanks its working. +1 for you –  sun Sep 4 '13 at 8:59

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.