web-dev-qa-db-fra.com

Slug pour une archive de type de post personnalisée

J'ai créé un nouveau type de message personnalisé, "Projets", et je souhaite que les archives de tous les messages de ce type soient disponibles sur mysite.com/projects. Pour le moment, tous les articles du projet sont affichés avec un slug comme suit: mysite.com/projects/project-title, mais lorsque je vais sur mysite.com/projects, je reçois un 404.

Voici comment j'ai construit le type de message personnalisé:

   /* Create the Project Custom Post Type ------------------------------------------*/
 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,
    // Uncomment the following line to change the slug; 
    // You must also save your permalink structure to prevent 404 errors
    'rewrite' => array( 'slug' => 'projects' ),
    'has_archive' => true,
    'supports' => array('title','editor','thumbnail'),

  ); 

  register_post_type(__( 'project' ),$args);
    }
2
urok93

Rien ne semble être incorrect - (et je pensais que vous alliez sauvegarder votre structure de liens permanents pour vider les règles de réécriture comme le suggèrent les commentaires? :)).

Je recommanderais d'utiliser ce plug-in pour déterminer les problèmes liés à votre redirection d'URL: http://wordpress.org/extend/plugins/monkeyman-rewrite-analyzer/ - mettez à jour votre question avec vos résultats et quelqu'un pourrait être capable d'offrir une solution

Cependant (mais ce n’est probablement pas la cause de votre problème), vous ne devez pas traduire le nom du type de message, vous devez avoir:

register_post_type('project',$args);

au lieu de

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

Les traductions sont dans l'intérêt de l'utilisateur - et ne doivent donc figurer que sur les étiquettes - les noms internes de WordPress ne doivent pas dépendre de la traduction.

3
Stephen Harris

Le code que vous avez collé ne semble pas être incorrect, mais ce que vous demandez fonctionnera également avec 'rewrite' => true

http://codex.wordpress.org stipule:

has_archive (booléen ou chaîne) (facultatif) Active les archives de type publication. Utilisera $ post_type comme archive slug par défaut.

Par défaut: false

Remarque: générera les règles de réécriture appropriées si la réécriture est activée. Utilisez également rewrite pour> changer le slug utilisé.

Une solution à votre problème peut être que le modèle pour le type d'article personnalisé ne fonctionne pas ou n'a pas été créé, vous pouvez soit essayer d'ajouter le code suivant à votre function.php ou à la fonction plugins:

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

et dans vos pages 'single-projects.php'/'archive-projects.php', créez une boucle/requête/get_pages (celle que vous préférez) pour importer et afficher le contenu:

    $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 = 'There is no description for this package';
        }
        echo '<div class="content">';
        echo $content;
        echo '</div>';      

    }

J'espère que cela t'aides!

1
Terry Barriff