Tipos de posts personalizados filtrados por taxonomía usando REST API v2

2 ago 2017, 14:54:05
Vistas: 29.8K
Votos: 16

Tengo la siguiente situación:

Creé un tipo de Post personalizado llamado Works. Y también le adjunté una taxonomía personalizada llamada Work Types

Aquí está el código

function rk_work_post_type(){
$labels = array(
    'name'               => 'Trabajo',
    'singular_name'      => 'Trabajo',
    'add_new'            => 'Añadir Trabajo',
    'all_items'          => 'Todos los Trabajos',
    'add_new_item'       => 'Añadir Trabajo',
    'edit_item'          => 'Editar Trabajo',
    'new_item'           => 'Nuevo Trabajo',
    'view_item'          => 'Ver Trabajo',
    'search_item'        => 'Buscar Trabajo',
    'not_found'          => 'No se encontraron elementos',
    'not_found_in_trash' => 'No se encontraron elementos en la papelera',
    'parent_item_colon'  => 'Elemento Padre'
);
$args = array(
    'labels' => $labels,
    'public' => true,
    'has_archive' => true,
    'publicly_queryable' => true,
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'supports' => array(
        'title',
        'editor',
        'excerpt',
        'thumbnail',
        'revisions',
        'comments',
    ),
    // 'taxonomies' => array('category', 'post_tag'),
    'menu_icon' => 'dashicons-hammer',
    'menu_position' => 5,
    'exclude_from_search' => false,
    'show_in_rest'       => true,
    'rest_base'          => 'works',
    'rest_controller_class' => 'WP_REST_Posts_Controller',      
);
register_post_type('work',$args);
}

add_action('init','rk_work_post_type');


function rk_work_taxonomies() {
//añadir nueva taxonomía jerárquica
$labels = array(
    'name' => 'Tipos de Trabajo',
    'singular_name' => 'Tipo de trabajo',
    'search_items' => 'Buscar Tipos',
    'all_items' => 'Todos los Tipos de Trabajo',
    'parent_item' => 'Tipo Padre',
    'parent_item_colon' => 'Tipo Padre:',
    'edit_item' => 'Editar Tipo de Trabajo',
    'update_item' => 'Actualizar Tipo de Trabajo',
    'add_new_item' => 'Añadir Nuevo Tipo de Trabajo',
    'new_item_name' => 'Nombre del Nuevo Tipo de Trabajo',
    'menu_name' => 'Tipos de Trabajo'
);

$args = array(
    'hierarchical' => true,
    'labels' => $labels,
    'show_ui' => true,
    'show_admin_column' => true,
    'query_var' => true,
    'rewrite' => array( 'slug' => 'work_type' ),
    'show_in_rest'       => true,
    'rest_base'          => 'work_type',
    'rest_controller_class' => 'WP_REST_Terms_Controller',      
);

register_taxonomy('work_type', array('work'), $args);
}
add_action( 'init' , 'rk_work_taxonomies' );

El problema que tengo es que no puedo encontrar una manera de obtener los Works filtrados por Work Type usando REST API v2

Leí que después de alguna actualización de WordPress, la consulta de filtro fue eliminada de la REST API. Entonces, ¿cuál es la forma correcta de hacer esto ahora? ¿Pueden proporcionar algún ejemplo por favor?

¡Gracias de antemano!

0
Todas las respuestas a la pregunta 4
4
19

Ok, la solución fue:

example.com/wp-json/wp/v2/works?work_type=10

Muestra los tipos de trabajo como IDs. Puedes ver los IDs en:

example.com/wp-json/wp/v2/works
2 ago 2017 15:16:25
Comentarios

para recuperar por slug solo agrega _slug al final del slug de la categoría. work_type_slug={slug}

user254153 user254153
1 sept 2018 09:13:12

Agregar _slug al final del parámetro no funciona para mí. Estoy usando WordPress 4.9.8, REST API v2. Sin embargo, usar el id funciona perfectamente.

Si deseas obtener el término único desde la REST API basado en el slug, entonces usa slug={term_slug} por ejemplo:

example.com/wp-json/wp/v2/works?slug=work-type-slug

Tim Tim
1 oct 2018 16:49:55

Para que funcione, necesitas 'show_in_rest' => true, en register_taxonomy.

That Brazilian Guy That Brazilian Guy
20 may 2019 18:26:46

@ThatBrazilianGuy ¿podrías por favor indicar alguna documentación al respecto? La técnica no parece funcionar con WP 5.3.2

jgangso jgangso
2 ene 2020 10:09:58
3

Instalé el plugin WP REST Filter y luego puedo filtrar publicaciones por el slug de categoría como:

http://www.example.com/wp-json/wp/v2/my_custom_posts?filter[my_custom_taxomony]=my_custom_taxonomy_slug

en tu caso:

http://www.example.com/wp-json/wp/v2/works?filter[work_type]=building
5 mar 2019 15:13:35
Comentarios

por favor marca como solución. ;)

DARKVIDE DARKVIDE
5 feb 2020 14:38:53

creo que usar un plugin no es "la solución"

ZecKa ZecKa
29 abr 2020 11:55:40

Estoy de acuerdo, simplemente instalar un plugin usualmente no es la solución cuando el OP está publicando código.

Simao Gomes Viana Simao Gomes Viana
2 may 2024 16:00:57
1

Si realmente necesitas usar el slug como parámetro en la URL, puedes añadir un filtro personalizado. Echa un vistazo al hook rest_{$this->post_type}_query.

Puedes hacer algo como esto (post_type: work, taxonomy: work_type):

/**
 * Filtra el tipo de post 'work' por el slug de 'work_type'
 *
 * @param array $args
 * @param WP_Rest_Rquest $request
 * @return array $args
 */
function filter_rest_work_query( $args, $request ) { 
    $params = $request->get_params(); 
    if(isset($params['work_type_slug'])){
        $args['tax_query'] = array(
            array(
                'taxonomy' => 'work_type',
                'field' => 'slug',
                'terms' => explode(',', $params['work_type_slug'])
            )
        );
    }
    return $args; 
}   
// Añade el filtro 
add_filter( "rest_work_query", 'filter_rest_work_query', 10, 2 ); 

y luego

https://example.com/wp-json/wp/v2/work?work_type_slug=slug01,slug02
29 abr 2020 11:54:53
Comentarios

Usar este código solo funcionará si no hay otras taxonomías siendo pasadas. (Establecer $args['tax_query'] explícitamente de esta manera sobrescribirá cualquier otro valor de tax_query que pueda estar definido). Necesitarás verificar si el array está definido y extenderlo si es así, en lugar de sobrescribirlo.

Mark Howells-Mead Mark Howells-Mead
16 sept 2021 15:16:58
0
-1

https://developer.wordpress.org/reference/functions/get_posts/

Este enlace es útil

Incluye el método get_posts() Que se utiliza para obtener publicaciones

Pasa el tipo de publicación como argumento

5 mar 2019 16:09:35