2015-06-20 72 views
1

我試圖發送AJAX數據到我的wordpress表,但我可以從我的PHP得到的是一個0。它在管理方面。誰能幫我?WordPress插件ajax返回0

此外,所有這些代碼都在我的插件文件夾中的plugin-admin.php文件中。

<?php 
    if (! defined('ABSPATH') || ! current_user_can('manage_options')) exit; 

    global $wpdb; 
    global $wp_version; 


    $results = $wpdb -> get_results(
       " 
       SELECT ID, post_title, post_excerpt 
       FROM $wpdb->posts 
       WHERE post_type = 'post' and post_status NOT LIKE 'auto-draft' 
       AND post_title NOT LIKE 'Auto Draft' 
       AND post_status = 'publish' 
       ORDER BY post_title 
       " 
      ); 

    add_action('wp_ajax_featured_submit_action', 'featured_submit_callback'); 

    function featured_submit_callback(){ 
    echo "hi"; 

    wp_die(); 
    } 



?> 

<div class="wrap"> 
    <h2>Select Posts</h2> 
    <select id="selected-posts" multiple="multiple"> 
     <?php 
     foreach ($results as $result){ 
      ?><option value="<?php echo $result->ID; ?>"> <?php echo $result->post_title; ?> </option> <?php 
     } 
     ?> 
    </select> 
    <br> 
    <input type="submit" id="sposts-submit"></input> 


</div> 

<script> 
    jQuery(document).ready(function($) { 

    var spostsarray = new Array(); 

    //Click button 
    $("#sposts-submit").click(function(){ 

     var spostsarray = new Array(); 

     $("#selected-posts").each(function(item){ 
     spostsarray.push($(this).val()); 
     }); 
     console.log(spostsarray); 

     var data = { 
     "action": "featured_submit_action", 
     "posts": spostsarray 
     } 

     $.ajax({ 
     url: "<?php echo admin_url('admin-ajax.php'); ?>", 
     type: "POST", 
     action: "featured_submit_action", 
     data: {"posts": spostsarray}, 
     success: function(data){ 
      console.log(data); 
     } 
     }); 

    }); 


    }); 
</script> 

我凝聚了一點,但總的想法是,我可以抓住所有的最新文章,並且用​​戶可以選擇他們想要展示的,發送給PHP方法和編輯表它。

問題是與我的AJAX回調我只回到0而不是從JavaScript發送的數據。

求助: 經過Rohil_PHPBeginner的一些幫助,我找到了答案。它沒有工作的原因是我正在從菜單頁執行代碼,此時添加一個鉤子爲時已晚。下面是我用來解決它的頁面:

AJAX in WP Plugin returns 0 always

+0

你在瀏覽器中調試? –

+0

是的,但我找不到什麼錯。 – lostAstronaut

+0

你應該能夠看到請求和響應,看起來一切正常嗎?你有沒有在程序之外運行你的查詢? –

回答

1

下面代碼工作完美的罰款對我來說:

<?php 
     global $wpdb; 
     global $wp_version; 


     $results = $wpdb -> get_results(
        " 
        SELECT ID, post_title, post_excerpt 
        FROM $wpdb->posts 
        WHERE post_type = 'post' and post_status NOT LIKE 'auto-draft' 
        AND post_title NOT LIKE 'Auto Draft' 
        AND post_status = 'publish' 
        ORDER BY post_title 
        " 
       ); 
    ?> 

    <div class="wrap"> 
     <h2>Select Posts</h2> 
     <select id="selected-posts" multiple="multiple"> 
      <?php 
      foreach ($results as $result){ 
       ?><option value="<?php echo $result->ID; ?>"> <?php echo $result->post_title; ?> </option> <?php 
      } 
      ?> 
     </select> 
     <br> 
     <input type="submit" id="sposts-submit"></input> 
    </div> 

<?php 
add_action('wp_ajax_featured_submit_action', 'featured_submit_callback'); 
add_action('wp_ajax_nopriv_featured_submit_action', 'featured_submit_callback'); 

function featured_submit_callback(){ 
    echo "hi"; 
    wp_die(); 
} 
?> 

    <script> 
     jQuery(document).ready(function($) { 
     //Click button 
     $("#sposts-submit").click(function(){ 

      var spostsarray = new Array(); 

      $("#selected-posts").each(function(item){ 
      spostsarray.push($(this).val()); 
      }); 
      console.log(spostsarray); 

      var data = { 
      "action": "featured_submit_action", 
      "posts": spostsarray 
      } 

      $.ajax({ 
      url: ajaxurl, 
      type: "POST", 
      data: data, 
      success: function(data){ 
       console.log(data); 
      } 
      }); 

     }); 
     }); 
    </script> 

你並不需要通過AJAX網址以這種方式,因爲當我使用你的代碼,它顯示了我的PHP。 WordPress提供了一個默認的AJAX網址,所以你可以使用(我在下面的代碼中使用的ajaxurl)。

除此之外您還沒有爲no-privilege用戶添加代碼(如果它將僅用於特權用戶,那麼它是好的,否則您需要爲此添加代碼)。

+0

我剛剛嘗試了您的代碼,但似乎仍然得到響應0 – lostAstronaut

+0

問題是他們都在同一個文件中? – lostAstronaut

+0

我想通了,這是要遲到鉤動作,你的答案幫助我到達那裏。 – lostAstronaut

1

當ajax調用沒有找到有效的回調函數時(雖然0可能會從許多其他事物返回),WordPress返回0。

WordPress會在用戶登錄時查找匹配wp_ajax_{callback}的回調,當用戶註銷時查找wp_ajax_nopriv_{callback}。 {callback}填充了「action」隱藏輸入的POST'd值。請注意,您沒有將action傳入您的AJAX通話。你應該改變: data: {"posts": spostsarray},data: data

既然你不打算匹配的回調函數,而不傳遞動作,WordPress是返回0

+0

另外'''''''''''''''''另外'''''''簡化爲SELECT ID,post_title,post_excerpt FROM $ wpdb-> posts WHERE post_type ='post'和post_title不像'自動生成草稿'AND post_status ='發佈'ORDER BY post_title'。另外,限制/分頁查詢。這將殺死1k +帖子的服務器。此外,您應該真的使用WP_Query來利用WP內置的SQL緩存而不是直接的SQL – Chris