Obtener posts de un tipo de post personalizado con WP REST API
¿Cómo puedo obtener todos los posts de un tipo de post personalizado específico con WP REST API (ya sea v1 o v2)? Soy muy nuevo en esto y estoy tratando de entender cómo hacerlo.
Actualmente estoy usando WP REST API v2 y logré obtener una lista de todos los tipos de posts con esto
http://domain.com/wp-json/wp/v2/types
y luego logré obtener el tipo de post que me interesa con
http://domain.com/wp-json/wp/v2/types/the-icons-update
¿Cómo obtengo todos los posts de ese tipo de contenido específico?
He intentado con
http://domain.com/wp-json/wp/v2/posts?filter[post_type]=the-icons-update
Pero devuelve un array vacío (supongo que devuelve los posts predeterminados y en mi sitio solo hay posts dentro del tipo de post personalizado que estoy tratando de recuperar).
¿Podría haber un problema con la forma en que registré el tipo de post?
function custom_post_type() {
$labels = array(
'name' => _x( 'The Icons Update', 'nombre general del tipo de post' ),
'singular_name' => _x( 'The Icons Update', 'nombre singular del tipo de post' ),
'add_new' => _x( 'Agregar Página', 'revista' ),
'add_new_item' => __( 'Agregar Nueva Página' ),
'edit_item' => __( 'Editar Página' ),
'new_item' => __( 'Nueva Página' ),
'all_items' => __( 'Todas las Páginas' ),
'view_item' => __( 'Ver Página' ),
'search_items' => __( 'Buscar Páginas' ),
'not_found' => __( 'No se encontró ninguna Página' ),
'not_found_in_trash' => __( 'No se encontró ninguna Página en la Papelera' ),
'parent_item_colon' => '',
'menu_icon' => '',
'menu_name' => 'The Icons Update'
);
$args = array(
'labels' => $labels,
'description' => 'Contiene nuestros proyectos y datos específicos del proyecto',
'public' => true,
'menu_position' => 5,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields' ),
'has_archive' => true,
'taxonomies' => array('post_tag', 'category'),
'hierarchical' => false,
'query_var' => true,
'queryable' => true,
'searchable' => true,
'rewrite' => array( 'slug' => 'the-icons-update' )
);
register_post_type( 'magazine', $args );
flush_rewrite_rules();
}
add_action( 'init', 'custom_post_type' );
Cualquier ayuda con esto es realmente apreciada.
Solo agrega el siguiente parámetro a la función register_post_type, puede ir antes del parámetro 'menu_position': 'show_in_rest' => true
Si estás usando un plugin para registrar tu tipo de publicación, puedes usar el siguiente código:
add_action( 'init', 'add_anuncios_to_json_api', 30 );
function add_anuncios_to_json_api(){
global $wp_post_types;
$wp_post_types['anuncio']->show_in_rest = true;
}
Después de eso, podrás listar tus publicaciones desde mydomain.com/wp-json/wp/v2/posttype_slug
En mi caso: mydomain.com/wp-json/wp/v2/anuncio
También puedes registrar una nueva base usando el siguiente código:
add_action( 'init', 'add_anuncios_to_json_api', 30 );
function add_anuncios_to_json_api(){
global $wp_post_types;
$wp_post_types['anuncio']->show_in_rest = true;
$wp_post_types['anuncio']->rest_base = 'clasi';
$wp_post_types['anuncio']->rest_controller_class = 'WP_REST_Posts_Controller';
}
Solo reemplaza anuncio
por el slug de tu tipo de publicación y 'clasi' será tu ruta: mydomain.com/wp-json/wp/v2/clasi

¡Gracias, esto casi resuelve mi problema! Ahora obtengo algunas publicaciones de ese tipo de publicación específico, pero no aparecen todas y además sus datos no están completos, por ejemplo, la categoría no se muestra y también necesito que los campos personalizados avanzados (ACF) aparezcan (en WP REST API v1.2.3 logré hacer que los ACF aparecieran). Gracias por tu ayuda con esto.

Para mostrar tipos de entrada personalizados en la versión 2, necesitas agregar 'show_in_rest' => true
en los argumentos de la función register_post_type, luego tus publicaciones con ese tipo de entrada personalizado estarán disponibles en el endpoint: wp-json/wp/v2/tu-tipo-entrada-personalizado.
Fuente: http://scottbolinger.com/custom-post-types-wp-api-v2/

Aquí está mi respuesta completa:-
function prefix_register_post_type()
{
register_post_type(
'prefix_portfolio',
array(
'labels' => array(
'name' => __('Portafolio', 'text_domain'),
'singular_name' => __('Portafolio', 'text_domain'),
'menu_name' => __('Portafolio', 'text_domain'),
'name_admin_bar' => __('Elemento de Portafolio', 'text_domain'),
'all_items' => __('Todos los Elementos', 'text_domain'),
'add_new' => _x('Añadir Nuevo', 'prefix_portfolio', 'text_domain'),
'add_new_item' => __('Añadir Nuevo Elemento', 'text_domain'),
'edit_item' => __('Editar Elemento', 'text_domain'),
'new_item' => __('Nuevo Elemento', 'text_domain'),
'view_item' => __('Ver Elemento', 'text_domain'),
'search_items' => __('Buscar Elementos', 'text_domain'),
'not_found' => __('No se encontraron elementos.', 'text_domain'),
'not_found_in_trash' => __('No se encontraron elementos en la Papelera.', 'text_domain'),
'parent_item_colon' => __('Elementos Padre:', 'text_domain'),
),
'public' => true,
'menu_position' => 5,
'supports' => array(
'title',
'editor',
'thumbnail',
'excerpt',
'custom-fields',
),
'taxonomies' => array(
'prefix_portfolio_categories',
),
'has_archive' => true,
'rewrite' => array(
'slug' => 'portafolio',
),
)
);
}
add_action('init', 'prefix_register_post_type');
function prefix_register_taxonomy()
{
register_taxonomy(
'prefix_portfolio_categories',
array(
'prefix_portfolio',
),
array(
'labels' => array(
'name' => _x('Categorías', 'prefix_portfolio', 'text_domain'),
'singular_name' => _x('Categoría', 'prefix_portfolio', 'text_domain'),
'menu_name' => __('Categorías', 'text_domain'),
'all_items' => __('Todas las Categorías', 'text_domain'),
'edit_item' => __('Editar Categoría', 'text_domain'),
'view_item' => __('Ver Categoría', 'text_domain'),
'update_item' => __('Actualizar Categoría', 'text_domain'),
'add_new_item' => __('Añadir Nueva Categoría', 'text_domain'),
'new_item_name' => __('Nombre de Nueva Categoría', 'text_domain'),
'parent_item' => __('Categoría Padre', 'text_domain'),
'parent_item_colon' => __('Categoría Padre:', 'text_domain'),
'search_items' => __('Buscar Categorías', 'text_domain'),
),
'show_admin_column' => true,
'hierarchical' => true,
'rewrite' => array(
'slug' => 'portafolio/categoria',
),
)
);
}
add_action('init', 'prefix_register_taxonomy', 0);
También deberías registrar la taxonomía al registrar el tipo de contenido personalizado.
Después de esto, la solicitud sería:
wp-json/wp/v2/posts/?taxonomy=prefix_portfolio_categories'&term=tu-cualquier-categoria
Espero que esto te ayude :)

Ten en cuenta que si configuras query_var como false al registrar la taxonomía personalizada, necesitarás cambiar los parámetros a: wp-json/wp/v2/posts/?taxonomy=job-type&term=manager (es solo un ejemplo)

Gracias pero tampoco funcionó. ¿Podría haber un problema con cómo registré el tipo de contenido personalizado? He actualizado la pregunta, si pudieras echarle un vistazo te estaría muy agradecido
