Custom post type filtrati per tassonomia utilizzando REST API v2

2 ago 2017, 14:54:05
Visualizzazioni: 29.8K
Voti: 16

Mi trovo nella seguente situazione:

Ho creato un Custom Post Type chiamato Works. E ho anche collegato ad esso una tassonomia personalizzata chiamata Work Types

Ecco il codice

function rk_work_post_type(){
$labels = array(
    'name'               => 'Lavoro',
    'singular_name'      => 'Lavoro',
    'add_new'            => 'Aggiungi Lavoro',
    'all_items'          => 'Tutti i Lavori',
    'add_new_item'       => 'Aggiungi Lavoro',
    'edit_item'          => 'Modifica Lavoro',
    'new_item'           => 'Nuovo Lavoro', 
    'view_item'          => 'Visualizza Lavoro',
    'search_item'        => 'Cerca Lavoro',
    'not_found'          => 'Nessun elemento trovato',
    'not_found_in_trash' => 'Nessun elemento trovato nel cestino',
    'parent_item_colon'  => 'Elemento Genitore'
);
$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() {
//aggiungi nuova tassonomia gerarchica
$labels = array(
    'name' => 'Tipi di Lavoro',
    'singular_name' => 'Tipo di Lavoro',
    'search_items' => 'Cerca Tipi',
    'all_items' => 'Tutti i Tipi di Lavoro',
    'parent_item' => 'Tipo Genitore',
    'parent_item_colon' => 'Tipo Genitore:',
    'edit_item' => 'Modifica Tipo di Lavoro',
    'update_item' => 'Aggiorna Tipo di Lavoro',
    'add_new_item' => 'Aggiungi Nuovo Tipo di Lavoro',
    'new_item_name' => 'Nome Nuovo Tipo di Lavoro',
    'menu_name' => 'Tipi di Lavoro'
);

$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' );

Il problema che ho è che non riesco a trovare un modo per ottenere i Works filtrati per Work Type utilizzando REST API v2

Ho letto che dopo alcuni aggiornamenti di WordPress la query di filtro è stata rimossa dalla REST API. Quindi qual è il modo corretto per farlo ora? Potete fornire qualche esempio per favore?

Grazie in anticipo!

0
Tutte le risposte alla domanda 4
4
19

Ok, la soluzione era:

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

Mostra i work_types come ID. Puoi visualizzare gli ID in:

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

per recuperare tramite slug basta aggiungere _slug alla fine dello slug della categoria. work_type_slug={slug}

user254153 user254153
1 set 2018 09:13:12

Aggiungere _slug alla fine del parametro non funziona per me. Sto usando WordPress 4.9.8, REST API v2. Usare l'id funziona benissimo però.

Se vuoi ottenere il singolo termine dalla REST API basandoti sullo slug, allora devi usare slug={term_slug} ad esempio:

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

Tim Tim
1 ott 2018 16:49:55

Per farlo funzionare, devi avere 'show_in_rest' => true, in register_taxonomy.

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

@ThatBrazilianGuy potresti per favore indicare della documentazione a riguardo? La tecnica non sembra funzionare con WP 5.3.2

jgangso jgangso
2 gen 2020 10:09:58
3

Ho installato il plugin WP REST Filter e ora posso filtrare i post per slug della categoria in questo modo:

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

nel tuo caso:

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

per favore segna come soluzione. ;)

DARKVIDE DARKVIDE
5 feb 2020 14:38:53

Penso che usare un plugin non sia "la soluzione"

ZecKa ZecKa
29 apr 2020 11:55:40

Sono d'accordo, semplicemente installare un plugin di solito non è la soluzione quando l'OP sta postando del codice.

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

Se hai davvero bisogno di utilizzare lo slug come parametro URL, puoi aggiungere un filtro personalizzato. Dai un'occhiata all'hook rest_{$this->post_type}_query

Puoi fare qualcosa del genere (post_type: work, taxonomy: work_type):

/**
 * Filtra il post_type work per work_type slug
 *
 * @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; 
}   
// Aggiungi il filtro 
add_filter( "rest_work_query", 'filter_rest_work_query', 10, 2 ); 

e poi

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

L'utilizzo di questo codice funzionerà solo se non ci sono altre tassonomie passate. (Impostando $args['tax_query'] esplicitamente in questo modo si sovrascriveranno eventuali altri valori di tax_query che potrebbero essere impostati.) Sarà necessario verificare se l'array è definito ed estenderlo in tal caso, anziché sovrascriverlo.

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

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

Questo link è utile

Include il metodo get_posts() Che viene utilizzato per ottenere i post

Passa il tipo di post come argomento

5 mar 2019 16:09:35