Slug pentru arhiva tipului de postare personalizat

14 mai 2012, 17:51:18
Vizualizări: 20.2K
Voturi: 3

Am creat un nou tip de postare personalizat 'Projects' și vreau ca arhiva tuturor postărilor de acest tip să fie disponibilă la mysite.com/projects. În prezent, toate postările individuale de tip proiect sunt afișate cu un slug după cum urmează mysite.com/projects/project-title, dar când accesez mysite.com/projects primesc o eroare 404.

Iată cum am construit tipul de postare personalizat:

   /* Creează tipul de postare personalizat Project ------------------------------------------*/
 function create_post_type_project() 
 {
$labels = array(
    'name' => __( 'Proiecte' ),
    'singular_name' => __( 'Proiect' ),
    'add_new' => __('Adaugă nou'),
    'add_new_item' => __('Adaugă proiect nou'),
    'edit_item' => __('Editează proiect'),
    'new_item' => __('Proiect nou'),
    'view_item' => __('Vezi proiect'),
    'search_items' => __('Caută proiect'),
    'not_found' =>  __('Nu s-a găsit niciun proiect'),
    'not_found_in_trash' => __('Nu s-a găsit niciun proiect în coșul de gunoi'), 
    'parent_item_colon' => ''
  );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'exclude_from_search' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'query_var' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'menu_position' => null,
    // Decomentează următoarea linie pentru a schimba slug-ul; 
    // Trebuie să salvezi și structura permalink-urilor pentru a preveni erorile 404
    'rewrite' => array( 'slug' => 'projects' ),
    'has_archive' => true,
    'supports' => array('title','editor','thumbnail'),

  ); 

  register_post_type(__( 'project' ),$args);
    }
0
Toate răspunsurile la întrebare 2
5

Nu pare să fie nimic greșit - (și am presupus că ai salvat structura de permalink-uri pentru a reseta regulile de rescriere, așa cum sugerează comentariile? :) ).

Îți recomand să folosești acest plugin pentru a identifica problemele cu redirecționarea URL-urilor: http://wordpress.org/extend/plugins/monkeyman-rewrite-analyzer/ - actualizează întrebarea ta cu rezultatele obținute și cineva ar putea oferi o soluție

Totuși (deși probabil nu este cauza problemei tale), nu ar trebui să traduci numele tipului de post, ci să folosești:

register_post_type('project',$args);

în loc de

register_post_type(__( 'project' ),$args);

Traducerile sunt pentru beneficiul utilizatorului - așadar ar trebui să fie aplicate doar etichetelor - numele interne din WordPress nu ar trebui să depindă de traducere.

14 mai 2012 18:25:53
Comentarii

proiecte/?$ post_type: proiect (.?.+?)(/[0-9]+)?/?$ pagename: proiecte page: (.+?)/?$ category_name: proiecte

urok93 urok93
14 mai 2012 19:55:09

acum primesc o pagină albă goală când navighez la /proiecte

urok93 urok93
14 mai 2012 19:56:09

Aveam o paranteză în plus. Am eliminat-o acum. Poți include o captură de ecran cu pagina de analiză a rescrierii URL-urilor cu aceste rezultate?

Stephen Harris Stephen Harris
14 mai 2012 20:01:12

@drtranz- Am testat codul tău. Funcționează. Problema trebuie să fie de la un alt plugin. Dezactivează-le pe toate, treci la tema Twenty Eleven, resetează regulile de rescriere - și apoi încearcă codul. Reactivează câte un plugin pe rând - resetând regulile și testând după fiecare până găsești vinovatul. În final - testează tema.

Stephen Harris Stephen Harris
14 mai 2012 20:04:37

Mulțumesc, tocmai am reușit să funcționeze, se pare că trebuia doar să repar niște fișiere de șablon în tema curentă. Greșeală prostească, mulțumesc pentru ajutor!

urok93 urok93
15 mai 2012 19:24:46
1

Codul pe care l-ați lipit nu pare a fi incorect, însă ceea ce solicitați va funcționa și utilizând 'rewrite' => true

http://codex.wordpress.org menționează:

has_archive (boolean sau string) (opțional) Activează arhivele pentru tipul de post. Va folosi implicit $post_type ca slug pentru arhivă.

Implicit: false

Notă: Va genera regulile corecte de rescriere dacă rewrite este activat. De asemenea, folosiți rewrite pentru a schimba slug-ul utilizat.

O soluție la problema dvs. ar putea fi faptul că șablonul pentru tipul de post personalizat nu funcționează sau nu a fost creat, puteți încerca să adăugați următorul cod în functions.php sau în funcțiile pluginului:

function _post_type_template_smart(){

    global $post;

    $single_template_name = 'single-projects.php';
    $archive_template_name = 'archive-projects.php';

    if ( is_single() && 'projects' == get_post_type() ){

        $template = locate_template(array($single_template_name), true);

        if(empty($template)) {

          include(PLUGIN_DIR . 'template/' . $single_template_name);

          exit();
        }

    }else if( is_archive() && 'projects' == get_post_type() ){

        $template = locate_template(array($archive_template_name), true);

        if(empty($template)) {

          include(PLUGIN_DIR . 'template/' . $archive_template_name);

          exit();
        }

    }

}
add_filter('template_redirect', '_post_type_template_smart');

iar în paginile 'single-projects.php'/'archive-projects.php', creați o buclă/interogare/get_pages (oricare preferați) pentru a afișa conținutul:

    $args = array(
        //'child_of' => 0,
        'sort_order' => 'ASC',
        'sort_column' => 'post_modified',
        'hierarchical' => 1,
        'parent' => 0,
        'post_type' => 'projects',
        'post_status' => 'publish'
    );
    $pages = get_pages( $args );
    foreach ( $pages as $project ){
        $project_id = $project->ID;
        $project_link = get_page_link($project->ID);
        $project_title = $project->post_title;
        $content = $project->post_content;
        $author = $project->post_author;
        $posted_on = $project->post_date;

        if(empty($content)){
            $content = 'Nu există descriere pentru acest pachet';
        }
        echo '<div class="content">';
        echo $content;
        echo '</div>';      

    }

Sper că acest lucru vă ajută!

14 mai 2012 19:33:06
Comentarii

Eroarea 404 nu este o problemă de șablon - pagina 404 este folosită doar dacă conținutul nu poate fi găsit/determinat. Dacă WordPress nu poate găsi șablonul, va reveni la un șablon mai generic conform ierarhiei de șabloane. De asemenea - în șablon nu este nevoie să folosești get_pages sau get_posts - WordPress va fi deja preluat conținutul din baza de date și are nevoie doar de o buclă have_posts() pentru a-l afișa.

Stephen Harris Stephen Harris
14 mai 2012 19:37:32