Wordpress Rest API: Regresar más de 100 resultados

Actualmente estoy construyendo una aplicación web Vue para mostrar todos los tipos de correos personalizados, que recientemente superó 100 resultados. La API de Wordpress REST limita la cantidad de publicaciones a 100, y no puedo averiguar cómo paginar las solicitudes para obtener todos los posts en carga inicial.

Mi código actual es el siguiente:

getPosts: function(context) {
      return new Promise((resolve, reject) => {
        if (context.state.posts) {
          resolve();
        } else {
          axios
            .get(
              "https://localhost:81/admin/wp-json/wp/v2/cap?per_page=100"
            )
            .then(response => {
              this.posts = response.data;
              context.commit("storePosts", response.data);
              console.log("Cap retrieved from Vuex!");
              //console.log(this.posts);
              resolve();
            })
            .catch(error => {
              console.log(error);
              reject(error);
            });
        }
      });
    }

Tengo lo siguiente computed código para mostrar los resultados:

computed: {
    caps() {
      const caps = new Map();

      if (this.$store.state.loading === false) {
        sortPosts(this.$store.state.posts).forEach(post => {
          const c = post.acf.address.country;
          const s = post.acf.address.state;

          if (!resorts.has(c)) resorts.set(c, new Map());

          const stateMap = resorts.get(c);
          if (!stateMap.has(s)) stateMap.set(s, []);

          stateMap.get(s).push(post);
        });
      }
      return caps;
    }
  }

¿Cómo puedo iniciar la carga todos los puestos sin interacción del usuario?

Pregunta hecha hace 3 años, 5 meses, 0 días - Por compilercaptain


3 Respuestas:

  • Coloque esto en el sitio web de API REST para funciones. php

    add_filter( 'rest_{your_CPT}_collection_params', function ( $params, WP_Post_Type 
    $post_type ) {
        if ( '{your_CPT}' === $post_type->name && isset( $params['per_page'] ) ) {
            $params['per_page']['maximum'] = PHP_INT_MAX;
        }
        return $params;
    }, 10, 2 );
    

    Respondida el Dec 16, 2020 a las 21:26 - por stackscripter

    Votos positivos: 0 | Votos negativos: 0

  • Para poder obtener más de 100 resultados de la API de Wordpress REST, puedes usar la paginación de la siguiente manera en tu función getPosts:

    ```javascript getPosts: function(context) { return new Promise((resolve, reject) => { if (context.state.posts) { resolve(); } else { let allPosts = []; let page = 1;

      const fetchPosts = () => {
        return axios
          .get(
            `https://localhost:81/admin/wp-json/wp/v2/cap?per_page=100&page=${page}`
          )
          .then(response => {
            allPosts = allPosts.concat(response.data);
    
            const totalPages = response.headers['x-wp-totalpages'];
            page++;
    
            if (page <= totalPages) {
              return fetchPosts();
            } else {
              context.commit("storePosts", allPosts);
              console.log("Caps retrieved from Vuex!");
              resolve();
            }
          });
      };
    
      fetchPosts().catch(error => {
        console.log(error);
        reject(error);
      });
    }
    

    }); } ```

    En este código, se utiliza la recursión para realizar múltiples solicitudes a la API con páginas incrementales, permitiéndote obtener todos los posts sin interacción del usuario. Al final, se almacenan todos los posts en allPosts y se almacenan en el almacenamiento Vuex.

    Es importante tener en cuenta que la API de Wordpress REST devuelve el número total de páginas en la cabecera de la respuesta con la clave x-wp-totalpages, lo cual es útil para determinar cuántas solicitudes adicionales se deben realizar.

    Respondida el Dec 17, 2020 a las 21:26 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Hay dos enfoques que puedes utilizar para paginar los resultados de la API REST de WordPress y obtener más de 100 publicaciones:

    1. Usar el parámetro "page"

    Agrega el parámetro "page" a tu solicitud de API para especificar la página de resultados que deseas obtener. Por ejemplo:

    
    https://localhost:81/admin/wp-json/wp/v2/cap?per_page=100&page=2
    

    Esto te devolverá los resultados de la segunda página de publicaciones. Puedes continuar incrementando el número de página hasta que no queden más resultados.

    2. Usar el encabezado "X-WP-TotalPages"

    La API REST de WordPress también devuelve un encabezado llamado "X-WP-TotalPages" que indica el número total de páginas de resultados disponibles. Puedes utilizar este encabezado para determinar cuántas solicitudes de API necesitas realizar para obtener todos los resultados. Por ejemplo:

    ``` axios .get("https://localhost:81/admin/wp-json/wp/v2/cap?per_page=100") .then(response => { const totalPages = parseInt(response.headers["x-wp-totalpages"]);

    // Realiza solicitudes de API para cada página
    for (let i = 1; i <= totalPages; i++) {
      axios
        .get(
          `https://localhost:81/admin/wp-json/wp/v2/cap?per_page=100&page=${i}`
        )
        .then(pageResponse => {
          // Agrega los resultados de cada página a un array
          this.posts = [...this.posts, ...pageResponse.data];
        });
    }
    

    }); ```

    Una vez que tengas todos los resultados de las publicaciones, puedes actualizar el estado de Vuex con ellos.

    Ten en cuenta que puedes utilizar cualquiera de estos enfoques para paginar los resultados. El segundo enfoque es más eficiente, ya que solo realiza una solicitud inicial para obtener el número total de páginas.

    Respondida el Dec 17, 2020 a las 21:34 - por Gemini

    Votos positivos: 0 | Votos negativos: 0