• Resolved jrumol

    (@jrumol)


    Hello and thanks in advance.

    I wrote a plugin to create a custom end point and get info from the wordpress page in JSON format.

    Everything worked ok until the upgrade to wordpress 6.1.1

    This is the code of the plugin:

    <?php
    
    /**
     * Plugin name: Benedictus API
     * Plugin URL: https://benedictus.clickapps.org
     * Description: Un plugin hecho por mí para gestionar la conexión con la app.
     * Version: 0.99
     * Author: José Ramón Rubio Moldenhauer
    */
    
    // Ejemplo para pedir títulos de ángelus y en francés -> https://benedictus.clickapps.org/wp-json/beneapi/v1/alldocuments?idioma=fr&tipo_doc=angelus
    
    function get_AllDocuments($params) {
        
        // Estos son los parámetros que ponemos en la url con las marcas "?".
        $idioma = $params->get_param('idioma');
        $tipo_doc = $params->get_param('tipo_doc');
        
        $args = [
            
            'posts_per_page' => -1,
            'post_type' => $tipo_doc,
            'orderby' => 'post_date',
            'order' => 'ASC'
            
            ];
            
        $posts = new WP_Query($args);
        
        $data = [];
        $i = 0;
        
        foreach($posts->posts as $post) {
            
            $data[$i]['id'] = $post->ID;
            $data[$i]['fecha_post'] = $post->post_date;
            $data[$i]['fecha_doc'] = get_field('fecha_doc', $post->ID);
            
            switch ($idioma) {
                case 'en':
                    echo $data[$i]['titulo_EN'] = get_field('titulo_EN', $post->ID);
                    break;
                case 'es':
                    echo $data[$i]['titulo_ES'] = get_field('titulo_ES', $post->ID);
                    break;
                case 'it':
                    echo $data[$i]['titulo_IT'] = get_field('titulo_IT', $post->ID);
                    break;
                case 'de':
                    echo $data[$i]['titulo_DE'] = get_field('titulo_DE', $post->ID);
                    break;
                case 'fr':
                    echo $data[$i]['titulo_FR'] = get_field('titulo_FR', $post->ID);
                    break;
            }
            
            $i++;
            
        }
        
        return $data;
    }
    
    // Ejemplo de petición de documentos filtrados por taxonomía: https://benedictus.clickapps.org/wp-json/beneapi/v1/documentsfiltered?idioma=fr&tipo_doc=angelus&taxonomy=pred_ciclo&taxonomy_terms[]=a&taxonomy_terms[]=b
    
    function get_DocumentsFiltered($params) {
        
        // Estos son los parámetros que ponemos en la url con las marcas "?".
        $idioma = $params->get_param('idioma');
        $tipo_doc = $params->get_param('tipo_doc');
        $taxonomy = $params->get_param('taxonomy');
        $taxonomy_terms = $params -> get_param('taxonomy_terms');
        
        $args = [
            
            'posts_per_page' => -1,
            'post_type' => $tipo_doc,
            'orderby' => 'post_date',
            'order' => 'ASC',
            'tax_query' => array(
                    array(
                    'taxonomy' => $taxonomy,
                    'field' => 'slug',
                    'terms' => $taxonomy_terms,
                    'operator' => 'IN'
                    )
                )
            
            ];
            
        $posts = new WP_Query($args);
        
        $data = [];
        $i = 0;
        
        foreach($posts->posts as $post) {
            
            $data[$i]['id'] = $post->ID;
            $data[$i]['fecha_post'] = $post->post_date;
            $data[$i]['fecha_doc'] = get_field('fecha_doc', $post->ID);
            
            switch ($idioma) {
                case 'en':
                    echo $data[$i]['titulo_EN'] = get_field('titulo_EN', $post->ID);
                    break;
                case 'es':
                    echo $data[$i]['titulo_ES'] = get_field('titulo_ES', $post->ID);
                    break;
                case 'it':
                    echo $data[$i]['titulo_IT'] = get_field('titulo_IT', $post->ID);
                    break;
                case 'de':
                    echo $data[$i]['titulo_DE'] = get_field('titulo_DE', $post->ID);
                    break;
                case 'fr':
                    echo $data[$i]['titulo_FR'] = get_field('titulo_FR', $post->ID);
                    break;
            }
            
            $i++;
            
        }
        
        return $data;
    }
    
    function get_Document($params) {
        
        // Estos son los parámetros que ponemos en la url con las marcas "?".
        $id = $params -> get_param('id');
        $idioma = $params -> get_param('idioma');
            
        $post = get_post($id);
        
        $data = [];
            
            $data['id'] = $post->ID;
            $data['fecha_post'] = $post->post_date;
            $data['fecha_doc'] = get_field('fecha_doc', $post->ID);
            
            switch ($idioma) {
                case 'en':
                    echo $data['titulo_EN'] = get_field('titulo_EN', $post->ID);
                    break;
                case 'es':
                    echo $data['titulo_ES'] = get_field('titulo_ES', $post->ID);
                    break;
                case 'it':
                    echo $data['titulo_IT'] = get_field('titulo_IT', $post->ID);
                    break;
                case 'de':
                    echo $data['titulo_DE'] = get_field('titulo_DE', $post->ID);
                    break;
                case 'fr':
                    echo $data['titulo_FR'] = get_field('titulo_FR', $post->ID);
                    break;
            }
    
        
        return $data;
    }
    
    add_action('rest_api_init', function(){
       
        register_rest_route('beneapi/v1', 'alldocuments', [
           
           'methods' => 'GET',
           'callback' => 'get_AllDocuments',
           
           ]);
           
        register_rest_route('beneapi/v1', 'documentsfiltered', [
           
           'methods' => 'GET',
           'callback' => 'get_DocumentsFiltered',
           
           ]);
           
        register_rest_route('beneapi/v1', 'document', [
           
           'methods' => 'GET',
           'callback' => 'get_Document',
           
           ]);
        
    });

    And when I try to use the link:
    https://benedictus.clickapps.org/wp-json/beneapi/v1/alldocuments?idioma=fr&tipo_doc=angelus

    I should get in JSON the “id”, “fecha_post”, “fecha_doc” and “titulo”. However I get the list of all “titulo” not in JSON format, and afterwards, the JSON response.

    It worked ok before… but I don’t know what I am doing wrong.

Viewing 2 replies - 1 through 2 (of 2 total)
  • Moderator bcworkz

    (@bcworkz)

    Disclaimer: I don’t have much API experience, I’m not 100% confident of the accuracy of this response. Since it’s close to 2 days since you posted with no response so far, hopefully this is of some help to you anyway.

    Your callback should be returning a WP_Rest_Response object. You appear to be returning an array of data. You can use rest_ensure_response() to ensure your data is in a proper response object.
    https://developer.www.ads-software.com/rest-api/extending-the-rest-api/adding-custom-endpoints/#return-value

    It’s not unheard of to do something that’s technically incorrect, but it works anyway. Then sometime in the future it stops working because it was not done right from the start. In other words, just because it works doesn’t mean it was done right ??

    Thread Starter jrumol

    (@jrumol)

    Thanks for your reply.

    Actually, I fixed myself. And it was just a silly thing. The problem was that I put “echo” at the beginning of the lines to assign the values, so I got the value as well.

    But I deleted it and everything ok.

Viewing 2 replies - 1 through 2 (of 2 total)
  • The topic ‘Problem with custom end point that worked ok before updating wordpress’ is closed to new replies.