skip to Main Content

Hi im getting unexpected toke a in json at position 0 when i fetch the url. so i checked what im getting. when i console.log i get Array0; i dont how i can send the json to js. so here what i wanted is to use multi_thread_curl function to send multiple api request at the same time.so im getting array of two different content. one is from facebook and other one is from instagram. however when i try to send it over admin_ajax.php to js . i get Unexpected token A in JSON at position 0 error. i dont know what im doing wrong on this code. i will place the js code below as well.

function multi_thread_curl($urlArray, $optionArray, $nThreads) {

    //Group your urls into groups/threads.
    $curlArray = array_chunk($urlArray, $nThreads, $preserve_keys = true);
  
    //Iterate through each batch of urls.
    $ch = 'ch_';
    foreach($curlArray as $threads) {      
  
        //Create your cURL resources.
        foreach($threads as $thread=>$value) {
  
        ${$ch . $thread} = curl_init();
  
          curl_setopt_array(${$ch . $thread}, $optionArray); //Set your main curl options.
          curl_setopt(${$ch . $thread}, CURLOPT_URL, $value); //Set url.
  
          }
  
        //Create the multiple cURL handler.
        $mh = curl_multi_init();
  
        //Add the handles.
        foreach($threads as $thread=>$value) {
  
        curl_multi_add_handle($mh, ${$ch . $thread});
  
        }
  
        $active = null;
  
        //execute the handles.
        do {
  
        $mrc = curl_multi_exec($mh, $active);
  
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  
        while ($active && $mrc == CURLM_OK) {
  
            if (curl_multi_select($mh) != -1) {
                do {
    
                    $mrc = curl_multi_exec($mh, $active);
  
                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
            }
  
        }
  
        //Get your data and close the handles.
        foreach($threads as $thread=>$value) {
  
        $results[$thread] = curl_multi_getcontent(${$ch . $thread});
  
        // curl_multi_remove_handle($mh, ${$ch . $thread});
  
        }
  
        //Close the multi handle exec.
        curl_multi_close($mh);
  
    }
  
  
    return $results;
  
}   



function sns_display_post_action(){
    $facebookID = get_option( 'facebook_page_id' );
    $instagramID =  get_option( 'instagram_profile_id'  );
    $instagramName = get_option('instagram_profile_name');
    $optionArray = array(
  
      CURLOPT_RETURNTRANSFER   => TRUE,
     CURLOPT_TIMEOUT          => 10
  
    );
  $data = [];
  $access_token = get_option('access_token');
  $limitpost = get_option( 'post_count_number' );

 
 $data1 =  "https://graph.facebook.com/v14.0/$instagramID?fields=business_discovery.username($instagramName){id,name,profile_picture_url,media.limit($limitpost){id,owner,username,media_type,permalink,caption,timestamp,media_url,children{media_url}}}&access_token=$access_token";
 $data2 =  "https://graph.facebook.com/v14.0/$facebookID?fields=id,about,name,picture{url},posts.limit($limitpost){id,created_time,message,permalink_url,attachments{media_type,type,media,url,subattachments,unshimmed_url,description},full_picture}&access_token=$access_token";
 
  //Create an array of your urls.
  $urlArray = array(
  
     $data1,
     $data2
  
  );


  $nThreads = 2;
  
  //To use run the function.
  $results = multi_thread_curl($urlArray, $optionArray, $nThreads);
  echo json_encode($results);
   exit();

}

add_action( 'wp_ajax_sns_post_action', 'sns_display_post_action');
add_action( 'wp_ajax_nopriv_sns_post_action', 'sns_display_post_action');

the javascript fetch code

  let params =  new FormData();
params.append("action", sns_show_options.action);
params.append("nonce", sns_show_options.nonce);

    fetch(sns_show_options.api,{
    headers,
    body:params,
  } )
   .then(respon => respon.json())

   .then(res =>{
        console.log(res)
  
   })

im able to receive the json now. however it showing the backslash on the json i dont how i can solve it.
enter image description here

3

Answers


  1. Chosen as BEST ANSWER

    Hi guys i found a solution for the problem, but thank you for your feedback it actually helped a lot . i could output the $result by using jso_encode() however, i realized i was double encoding it. because on the function multi_thread_curl, curl_multi_getcontent was already encoding it.

    $results[$thread] = curl_multi_getcontent(${$ch . $thread});

    so i had to json_decode the curl_multi_get_content to remove the backslash from item of the array. but im also not sure if this is right to do, from the performance perspective. so far the code is working.


  2. $results is an array that you build up in multi_thread_curl, which you cannot echo outright, so your ajax is seeing Array. Use echo json_encode($results); instead.

    Login or Signup to reply.
  3. Echoing $result means the data is not encoded as a json object thereby returning an array. You should encode your result using json_encode($result) also exit after echo else it may introduce an unnecessary value 0;

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search