Reguli de rescriere WordPress pentru tipuri personalizate de postări și taxonomii

16 iun. 2011, 22:51:52
Vizualizări: 6.58K
Voturi: 9

Am găsit acest loc ca fiind o sursă bună de informații în trecut prin multe căutări Google pentru problemele întâlnite. Întrebarea mea se referă la regulile verbose de rescriere pe care WordPress le folosește.

Am configurat un tip personalizat de postare numit project și am înregistrat o taxonomie personalizată numită projects. Totul funcționează excelent, cu excepția opțiunilor de slug de rescriere, care ajung să intre în conflict - cel mai probabil din cauza regulilor de rescriere.

Practic, aceasta este structura pe care doresc să o obțin:

  • example.com/work/%taxonomy%/%post_name%/ (pentru postări)
  • example.com/work/%taxonomy%/ (listare postări aparținând unui anumit termen de taxonomie)
  • example.com/work/ (merge către page-work.php care include taxonomy.php pentru a lista toate postările asociate cu acea taxonomie)

Iată codul pe care îl am până acum, dar am nevoie de ajutor pentru a scrie regulile WP_Rewrite, deoarece aceasta este partea care mă blochează.

$labels = array(
    'name' => _x('Proiecte', 'nume general tip postare'),
    'singular_name' => _x('Proiect', 'nume singular tip postare'),
    'add_new' => _x('Adaugă nou', 'element proiect'),
    'add_new_item' => __('Adaugă proiect nou'),
    'edit_item' => __('Editează proiect'),
    'new_item' => __('Proiect nou'),
    'view_item' => __('Vezi proiect'),
    'search_items' => __('Caută proiecte'),
    'not_found' =>  __('Nimic găsit'),
    'not_found_in_trash' => __('Nimic găsit în coșul de gunoi'),
    'parent_item_colon' => ''
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'hierarchical' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // Este un tip de postare personalizat, nu încorporat!
    'capability_type' => 'post',
    'query_var' => "project", // Aceasta merge către schema WP_Query
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type('project' , $args);

// Taxonomia pentru proiecte
register_taxonomy('projects', array('project'), array(
    'public' => true,
    'hierarchical' => true,
    'label' => 'Categorii proiecte', 
    'singular_label' => 'Categorie proiect',
    'query_var' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
    )
);

Mulțumesc mult pentru ajutor! :-)

3
Comentarii

@ChristopherDavis Mulțumesc, voi analiza mai în detaliu aceste resurse și voi vedea cum merge.

matt_d_rat matt_d_rat
20 iun. 2011 03:19:43

Cred că această întrebare poate fi răspunsă prin consultarea Mixarea structurii de rescriere a tipurilor de postare personalizate și a taxonomiilor? Dacă acea întrebare nu te ajută, te rog să editezi această întrebare pentru a indica cum diferă.

Jan Fabry Jan Fabry
9 iul. 2011 16:18:09
Toate răspunsurile la întrebare 3
1

Sper că acest lucru vă poate rezolva problema

function my_custom_post_type() {
$labels = array(
    'name' => _x('Proiecte', 'nume general tip post'),
    'singular_name' => _x('Proiect', 'nume singular tip post'),
    'add_new' => _x('Adaugă nou', 'element proiect'),
    'add_new_item' => __('Adaugă proiect nou'),
    'edit_item' => __('Editează proiect'),
    'new_item' => __('Proiect nou'),
    'view_item' => __('Vezi proiect'),
    'search_items' => __('Caută proiecte'),
    'not_found' =>  __('Nu s-a găsit nimic'),
    'not_found_in_trash' => __('Nu s-a găsit nimic în coșul de gunoi'),
    'parent_item_colon' => '',
    'menu_name' => 'Proiecte' 
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
        'hierarchical' => false,
        'has_archive' => true,
    'rewrite' => array('slug'=>'proiecte', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // Este un tip de post personalizat, nu built-in!
    'capability_type' => 'post',
        'query_var' => true, // Acest lucru merge în schema WP_Query
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type( 'proiecte' , $args );

}
function my_custom_taxonomies() {

    $labels = array(
        'name' => __( 'Taxonomie', 'nume general taxonomie' ),
        'singular_name' => __( 'Taxonomie', 'nume singular taxonomie' ),
        'search_items' =>  __( 'Caută taxonomie' ),
        'all_items' => __( 'Toate taxonomiile' ),
        'parent_item' => __( 'Taxonomie părinte' ),
        'parent_item_colon' => __( 'Taxonomie părinte:' ),
        'edit_item' => __( 'Editează taxonomie' ), 
        'update_item' => __( 'Actualizează taxonomie' ),
        'add_new_item' => __( 'Adaugă taxonomie nouă' ),
        'new_item_name' => __( 'Nume taxonomie nouă' ),
        'menu_name' => __( 'Taxonomie' ),
    );  

    register_taxonomy( 'taxonomie', array('proiecte'), array (
                    'labels' => $labels,
                    'hierarchical' =>false,
                    'show_ui' => true,
                    'rewrite' => array( 'slug' => 'proiecte/taxonomie'),
                    'query_var' => true,
                    'show_in_nav_menus' => true,
                    'public' => true,
            ));
}

add_action('init', 'my_custom_post_type', 0);
add_action('init', 'my_custom_taxonomies', 10);

ceea ce trebuie să creați este archive-proiecte.php (arhiva tipului de post) și taxonomy.php care va fi folosit pentru a afișa arhiva taxonomiei personalizate.

18 dec. 2011 19:04:07
Comentarii

nu uita să schimbi "taxonomy" cu numele tău de taxonomie. Nu folosi aceeași valoare ca și post_type. Încearcă să folosești category pentru prima încercare. work/category , register_taxonomy('category, array('work'), array( ......

nonsensecreativity nonsensecreativity
18 dec. 2011 19:07:37
5

Am avut aceeași problemă și după multă luptă am ajuns la această soluție.
Doar adăugați acest cod

global $wp_rewrite;
$wp_rewrite->flush_rules(); 

function my_custom_post_type() {
    $labels = array(
        'name' => _x('Proiecte', 'nume general tip postare'),
        'singular_name' => _x('Proiect', 'nume singular tip postare'),
        'add_new' => _x('Adaugă nou', 'element proiect'),
        'add_new_item' => __('Adaugă Proiect Nou'),
        'edit_item' => __('Editează Proiect'),
        'new_item' => __('Proiect Nou'),
        'view_item' => __('Vezi Proiect'),
        'search_items' => __('Caută Proiecte'),
        'not_found' =>  __('Nimic găsit'),
        'not_found_in_trash' => __('Nimic găsit în Coșul de Gunoi'),
        'parent_item_colon' => '',
        'menu_name' => 'Proiecte' 
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
            'hierarchical' => false,
            'has_archive' => true,
        'rewrite' => array('slug'=>'work', 'with_front'=>false),
        'show_ui' => true,
        '_builtin' => false, // Este un tip de postare personalizat, nu unul built-in!
        'capability_type' => 'post',
            'query_var' => true, // Aceasta merge în schema WP_Query
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
    );

    register_post_type( 'work' , $args );

    global $wp_rewrite;   
    $wp_rewrite->flush_rules();    // acest lucru ar trebui să ajute 
}
2 ian. 2012 11:17:49
Comentarii

$wp_rewrite->flush_rules() nu ar trebui rulat atât de des, ar trebui folosit doar în cazul hook-urilor de activare sau dezactivare sau cât mai rar posibil. Este menționat aici: http://codex.wordpress.org/Rewrite_API/flush_rules DE ASEMENEA, este practic aceeași funcție cu aceasta: http://codex.wordpress.org/Function_Reference/flush_rewrite_rules

Jared Jared
14 ian. 2012 00:09:56

Pe de altă parte, așa am reușit să o implementez: http://pastebin.com/k7QvxKLi

Jared Jared
14 ian. 2012 00:19:10

@Jared Mulțumesc pentru observație, dar nu am reușit să găsesc o metodă de a realiza acest lucru atunci când este integrat în tema noastră (adică nu printr-un plugin). Te rog să sugerezi.

Dipesh KC Dipesh KC
17 ian. 2012 07:37:39

Codul ar fi plasat în functions.php în acest caz. Codul pentru un plugin și pentru o temă este exact același, singura diferență este că în teme acesta merge întotdeauna în functions.php sau într-un fișier inclus în functions.php

Jared Jared
17 ian. 2012 11:05:44

Aș sugera să folosești hook-ul after_switch_theme, este nou în versiunea 3.3 (dacă îmi amintesc corect).

Cristian Cristian
1 feb. 2012 19:18:00
0

O explicație mai detaliată este într-un alt articol, dar iată părțile de bază pe care trebuie să le adăugați:

  1. Înregistrați taxonomiile și tipurile de postare personalizate (CPT) așa cum faceți de obicei. Asigurați-vă că URL-ul de rescriere pentru taxonomie este "basename" și URL-ul de rescriere pentru CPT este "basename/%tax_name%".

  2. Spuneți WordPress ce să facă cu "%tax_name%" astfel:

    function filter_post_type_link($link, $post)
    {
    if ($post->post_type != 'custom_post_type_name')
        return $link;
    
    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, $link); // vezi funcția personalizată definită mai jos
    }
    return $link;
    }
    add_filter('post_type_link', 'filter_post_type_link', 10, 2);
    
17 feb. 2012 00:11:21