Slug per l'archivio dei tipi di post personalizzati

14 mag 2012, 17:51:18
Visualizzazioni: 20.2K
Voti: 3

Ho creato un nuovo tipo di post personalizzato 'Projects' e voglio che l'archivio di tutti i post di questo tipo sia disponibile su mysite.com/projects. Al momento tutti i singoli post del progetto vengono mostrati con uno slug del tipo mysite.com/projects/project-title, ma quando vado su mysite.com/projects ottengo un errore 404.

Ecco come ho costruito il tipo di post personalizzato:

   /* Crea il tipo di post personalizzato Project ------------------------------------------*/
 function create_post_type_project() 
 {
$labels = array(
    'name' => __( 'Projects' ),
    'singular_name' => __( 'Project' ),
    'add_new' => __('Add New'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Project'),
    'not_found' =>  __('No project found'),
    'not_found_in_trash' => __('No project found in Trash'), 
    '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,
    // Rimuovi il commento dalla riga seguente per modificare lo slug;
    // Devi anche salvare la struttura dei permalink per evitare errori 404
    'rewrite' => array( 'slug' => 'projects' ),
    'has_archive' => true,
    'supports' => array('title','editor','thumbnail'),

  ); 

  register_post_type(__( 'project' ),$args);
    }
0
Tutte le risposte alla domanda 2
5

Non sembra esserci nulla di errato - (e immagino che tu abbia salvato la struttura dei permalink per ripulire le regole di riscrittura come suggeriscono i commenti? :) ).

Consiglio di utilizzare questo plugin per identificare problemi con il reindirizzamento degli URL: http://wordpress.org/extend/plugins/monkeyman-rewrite-analyzer/ - aggiorna la tua domanda con i risultati e qualcuno potrebbe offrirti una soluzione

Tuttavia (ma probabilmente non è la causa del tuo problema), non dovresti tradurre il nome del tipo di post, usa:

register_post_type('project',$args);

invece di

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

Le traduzioni sono a beneficio dell'utente - e dovrebbero riguardare solo le etichette - i nomi interni di WordPress non dovrebbero dipendere dalla traduzione.

14 mag 2012 18:25:53
Commenti

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

urok93 urok93
14 mag 2012 19:55:09

ora ottengo una pagina bianca quando navigo su /progetti

urok93 urok93
14 mag 2012 19:56:09

Avevo una parentesi in più. Ora l'ho rimossa. Potresti includere uno screenshot della pagina dell'analizzatore di rewrite con questi risultati?

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

@drtranz- Ho testato il tuo codice. Funziona. Il problema deve essere un altro plugin. Disattivali tutti, passa a Twenty Eleven, svuota le rewrite rules - e poi prova il codice. Riattiva un plugin alla volta - svuotando le regole e testando dopo ognuno finché non trovi il colpevole. Infine - prova con il tema.

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

Grazie, l'ho appena fatto funzionare, si è rivelato che dovevo solo sistemare alcuni file template nel tema corrente. Errore stupido, grazie per il tuo aiuto!

urok93 urok93
15 mag 2012 19:24:46
1

Il codice che hai incollato non sembra essere errato, tuttavia quello che chiedi funzionerà anche utilizzando 'rewrite' => true

http://codex.wordpress.org afferma:

has_archive (booleano o stringa) (opzionale) Abilita gli archivi per il post type. Utilizzerà $post_type come slug dell'archivio di default.

Default: false

Nota: Genererà le regole di rewrite corrette se rewrite è abilitato. Usa anche rewrite per cambiare lo slug utilizzato.

Una soluzione al tuo problema potrebbe essere che il template per il custom post type non funziona o non è stato creato, puoi provare ad aggiungere il seguente codice al tuo functions.php o alla funzione del plugin:

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

e nelle tue pagine 'single-projects.php'/'archive-projects.php', crea un loop/query/get_pages (quello che preferisci) per recuperare e mostrare il contenuto:

    $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 = 'Non c\'è una descrizione per questo pacchetto';
        }
        echo '<div class="content">';
        echo $content;
        echo '</div>';      

    }

Spero che questo aiuti!

14 mag 2012 19:33:06
Commenti

Un 404 non è un problema del template - la pagina 404 viene utilizzata solo se il contenuto non può essere trovato/determinato. Se WordPress non riesce a trovare il template, passa a un template più generico secondo la gerarchia dei template. Inoltre - nel template non è necessario utilizzare get_pages o get_posts - WordPress avrà già recuperato il contenuto dal database e ha solo bisogno di un loop have_posts() per visualizzarlo.

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