Supporto » Sviluppare con WordPress » CPT e Taxonomies, problema con il permalink

  • Risolto ilfedevisio

    (@ilfedevisio)


    Sto cercando, a scopo didattico, di sviluppare un custom post type e una custom taxonomy con permalink del tipo “…/nome_taxonomy/taxonomy/articolo”.
    Si tratta di una sezione di un sito di recensioni, dove ho una prima pagina che mi mostra una specie di homepage (che non deve essere la homepage del sito), selezionando la categoria (taxonomy) entro nella categoria dei prodotti e selezionando l’articolo entro nella pagina dell’articolo stesso (CPT).
    In parole povere, vorrei avere la seguente struttura:

    • “…com/attrezzatura/”: in questa pagina voglio avere una archive page con la lista di tutte le tassonomie (disponibili tramite menu in alto) e i contenuti rilevanti di tali tassonomie
    • “.com/attrezzatura/cuffie/”: in questa pagina voglio la stessa identica pagina di prima, però filtrata con la taxonomy cuffie (o camere, o tastiere ecc), a cui si accede tramite il menu che rimane sempre e comunque in alto (come quello di apple, per intenderci)
    • “.com/attrezzatura/cuffie/recensione-prodottoX/: in questa pagina voglio avere il prodotto, con la sua recensione e i vari link.

    Per fare questo, ho creato un CPT chiamato recensioni e una tassonomia chiamata attrezzatura, per poi registrare il tutto in un plugin:

    Codice CPT:

    function cpt_recensioni(){
    
      $labels = array(
        'name' => __('Recensioni', 'fv-cpt'),
        'singular_name' => __('Recensione', 'fv-cpt'),
        'add_new' => __('Aggiungi Recensione', 'fv-cpt'),
        'all_items' => __('Tutte le Recensioni', 'fv-cpt'),
        'add_new_item' => __('Aggiungi Recensione', 'fv-cpt'),
        'edit_item' => __('Modifica Recensione', 'fv-cpt'),
        'new_item' => __('Nuova Recensione', 'fv-cpt'),
        'view_item' => __('Vedi Recensione', 'fv-cpt'),
        'search_item' => __('Cerca Recensione', 'fv-cpt'),
        'not_found' => __('Recensione non trovata', 'fv-cpt'),
        'not_found_in_trash' => __('Nessuna Recensione trovata nel cestino', 'fv-cpt'),
      );
      $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'publicly_queryable' => true,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'taxonomies' => array('attrezzatura'),
        'rewrite' => array(
          'slug' => 'attrezzatura/%taxonomy-name%',
          'with-front' => true,
        ),
        'support' => array(
          'title',
          'editor',
          'thumbnail',
          'revisions',
          'custom-fields',
        ),
        'menu_position' => 4,
        'menu_icon' => 'dashicons-star-filled',
        'exclude_from_search' => false,
      );
    
      register_post_type('recensioni', $args);
    }
    add_action('init', 'cpt_recensioni');

    Codice tassonomia:

    function tax_attrezzatura(){
    
        $labels = array(
          'name' => __('Categorie prodotti', 'fv-cpt'),
          'singular_name' => __('Categoria prodotto', 'fv-cpt'),
          'add_new_item' => __('Aggiungi Categoria prodotto', 'fv-cpt'),
          'edit_item' => __('Modifica Categoria prodotto', 'fv-cpt'),
          'new_item_name' => __('Nuova Categoria prodotto', 'fv-cpt'),
          'all_items' => __('Tutte le Categorie prodotto', 'fv-cpt'),
          'search_items' => __('Cerca Categoria Prodotto', 'fv-cpt'),
          'update_item' => __('Aggiorna Categoria prodotto', 'fv-cpt'),
        );
    
        $args = array(
          'labels' => $labels,
          'hierarchical' => true,
          'query_var' => true,
          'show_ui' => true,
          'show_admin_column' => true,
          'rewrite' => array(
            'slug' => 'attrezzatura',
            'hierarchical' => true,
            'with-front' => true,
          ),
        );
    
        register_taxonomy('attrezzatura',array('recensioni'), $args);
    }
    add_action('init', 'tax_attrezzatura');

    Dopo numerose guide online, ho capito che per ottenere ciò che voglio dovrei avere, nel rewrite della tassonomia, lo slug “attrezzatura” e nello slug del CPT “attrezzatura/%taxonomy-name%”. Per modificare il %taxonomy-name% mi sono servito di questa funzione:

    function filter_post_type_link($link, $post)
    {
        if ($post->post_type != 'recensioni')
            return $link;
    
        if ($cats = get_the_terms($post->ID, 'attrezzatura'))
        {
            $link = str_replace('%taxonomy-name%', $cats[0]->slug, $link);
          }
        return $link;
    }
    add_filter('post_type_link', 'filter_post_type_link', 10, 2);

    Ora, il permalink mi viene generato correttamente, ovvero per la recensione del prodotto X mi esce “/attrezzatura/cuffie/recensione-prodottoX/”, ma mi da un 404 nonostante io abbia creato il single-recensioni.php.
    il link “/attrezzatura/cuffie” mi restituisce correttamente il file “taxonomy-attrezzatura.php”, mentre il link “/attrezzatura/” mi restituisce un 404, nonostante io abbia creato una pagina con tale slug nelle pagine classiche standard di wordpress.

    Una cosa strana, inoltre, è che per un solo articolo presente nel CPT mi viene generato correttamente il link, mentre per gli altri wordpress mi rimanda tramite redirect 301 alla homepage del sito; non riesco a capire da cosa dipende.

    Qualcuno potrebbe aiutarmi a comprendere come generare correttamente un permalink del genere? Ho provato a cercare e ho riprovato tante volte, solo che non saprei con chi confrontarmi per capire il mio errore.
    Avrei anche bisogno di capire quale file devo scrivere nella directory del tema per stilizzare ognuna di queste pagine, visto che single-recensioni.php non funziona e nemmeno creare una pagina con url “/attrezzatura” funziona.

    Ho visto che in molti dicono di usare il “rewrite rules array” e comunicare a wordpress come effettivamente interpretare i link. Ho provato con il seguente codice ma ogni volta che cerco di visitare un qualsiasi link citato sopra, ottengo lo stesso redirect 301 indesiderato alla homepage del sito (come quello di cui ho parlato per gli articoli).

    add_filter('rewrite_rules_array', 'fv_rewrite_rules');
    function fv_rewrite_rules($rules) {
        $newRules  = array();
        $newRules['attrezzatura/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[1]';
        $newRules['attrezzatura/?$']      = 'index.php?taxonomy_name=$matches[0]';
    
        return array_merge($newRules, $rules);
    }

    Qualcuno in grado di spiegarmi come funziona? Non lo faccio di lavoro ma mi sono appassionato allo sviluppo da autodidatta, solo che per la prima volta il codex e i tutorial non mi sono serviti a comprendere dove sbaglio.

    • Questo topic è stato modificato 1 settimana, 4 giorni fa da ilfedevisio.
  • Devi essere collegato per rispondere a questo topic.