1

I am trying to create a REST API which generate json data for wordpress posts. The code below is in functions.php file:

add_action('wp_enqueue_scripts', 'create_json_data', 0);
function create_json_data(){
    ob_start();
    if (isset($_GET['getjson'])  && $_GET['getjson'] == true) {
        if (have_posts()) {
            $data = array();
            while (have_posts()) {
                the_post();
                $new_data = array(
                    "title" => get_the_title(), 
                    "content" => get_the_excerpt(), 
                    "image" => get_the_post_thumbnail_url(),
                    "hyperlink" => get_the_permalink()
                    );
                array_push($data, $new_data);
            }
        }
        header('Content-type: application/json');
        echo json_encode($data);
        exit();
    }
    ob_end_flush();
}

It runs very well in newly wordpress installation. But when I implement it in my online website it gives me error

Warning: Cannot modify header information - headers already sent by (output started at /home1/public_html/blogsite/wp-content/themes/webtheme/header.php:10) in /home1/public_html/website-theme/wp-content/themes/webtheme/functions.php on line 159

at line 10 in header.php is wp_head()

I don't know how to get ride of this error to generate json data only.

1 Answer 1

2

You need to create custom AJAX action. You will find everything you need on the codex : https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

Or you can use the Wordpress REST API plugin. It's allow you to create your own API endpoint. https://wordpress.org/plugins/rest-api/

EDIT I give you a little example, with the jQuery ajax code to call it.

add_action('wp_ajax_XXXXXX', 'ajax_XXXXXX');
add_action('wp_ajax_nopriv_XXXXXX', 'ajax_XXXXXX');
function ajax_XXXXXX() {
    header('Content-Type: application/json');
    echo json_encode(array(
        'text' => "Lorem ipsum dolor ...",
        'time' => time(),
        'user_id' => get_current_user_id()
    ));
    die();
}
$.ajax({
    url : "/wp-admin/admin-ajax.php",
    method : "POST",
    data : {
        action : "XXXXXX"
    },
    success : function(datas) {
        console.log(datas);
    }
});
Sign up to request clarification or add additional context in comments.

7 Comments

thank you. but when I use this hook it does't return me any json data
I am trying at url http://localhost:1234 by following your answer and it is returns whole page content instead of json data only.
It's weird, i've copy past my code on an empty wordpress i've on my localhost and it's work. Verify or ajax call URL. I've this : url : "http://127.0.0.1/wp-test/wp-admin/admin-ajax.php",
and I am adding this hook in functions.php file. will this work?
All hooks need to be in the theme functions.php, or include in the main plugin's file.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.