Slug para archivo de tipo de contenido personalizado

14 may 2012, 17:51:18
Vistas: 20.2K
Votos: 3

Creé un nuevo tipo de contenido personalizado 'Projects' y quiero que el archivo de todas las entradas de este tipo esté disponible en mysite.com/projects. Por el momento, todas las entradas individuales del proyecto se muestran con un slug de la siguiente manera mysite.com/projects/project-title, pero cuando voy a mysite.com/projects obtengo un error 404.

Así es como construí el tipo de contenido personalizado:

   /* Crear el Tipo de Contenido Personalizado 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,
    // Descomenta la siguiente línea para cambiar el slug; 
    // También debes guardar tu estructura de enlaces permanentes para prevenir errores 404
    'rewrite' => array( 'slug' => 'projects' ),
    'has_archive' => true,
    'supports' => array('title','editor','thumbnail'),

  ); 

  register_post_type(__( 'project' ),$args);
    }
0
Todas las respuestas a la pregunta 2
5

No parece haber nada incorrecto (y asumo que ya has guardado tu estructura de permalinks para actualizar las reglas de reescritura como sugieren los comentarios :)).

Recomendaría usar este plugin para identificar problemas con la redirección de URLs: http://wordpress.org/extend/plugins/monkeyman-rewrite-analyzer/ - actualiza tu pregunta con tus hallazgos y alguien podría ofrecer una solución.

Sin embargo (aunque probablemente no sea la causa de tu problema), no deberías traducir el nombre del tipo de publicación, usa:

register_post_type('project',$args);

en lugar de

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

Las traducciones son para beneficio del usuario, por lo que deben aplicarse solo a las etiquetas. Los nombres internos de WordPress no deberían depender de la traducción.

14 may 2012 18:25:53
Comentarios

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

urok93 urok93
14 may 2012 19:55:09

ahora obtengo una página en blanco cuando navego a /proyectos

urok93 urok93
14 may 2012 19:56:09

Tenía un corchete extra. Ya lo eliminé. ¿Podrías incluir una captura de pantalla de la página del analizador de reescritura con estos resultados?

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

@drtranz- He probado tu código. Funciona. El problema debe ser otro plugin. Desactívalos todos, cambia a Twenty Eleven, limpia las reescrituras y luego prueba el código. Reactiva los plugins uno a uno, limpiando las reglas y probando después de cada uno hasta encontrar el culpable. Por último, prueba el tema.

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

Gracias, acabo de hacerlo funcionar, resulta que solo necesitaba corregir algunos archivos de plantilla en la plantilla actual. Error tonto, ¡gracias por tu ayuda!

urok93 urok93
15 may 2012 19:24:46
1

El código que has pegado no parece ser incorrecto, sin embargo, lo que estás solicitando también funcionará usando 'rewrite' => true

http://codex.wordpress.org indica:

has_archive (booleano o string) (opcional) Habilita archivos para el tipo de post. Usará $post_type como slug del archivo por defecto.

Por defecto: false

Nota: Generará las reglas de reescritura adecuadas si rewrite está habilitado. También usa rewrite para cambiar el slug utilizado.

Una solución a tu problema podría ser que la plantilla para el tipo de contenido personalizado no esté funcionando o no se haya creado. Puedes intentar añadir el siguiente código a tu functions.php o a la función 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');

Y en tus páginas 'single-projects.php'/'archive-projects.php', crea un loop/query/get_pages (el que prefieras) para traer y mostrar el contenido:

    $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 = 'No hay descripción para este paquete';
        }
        echo '<div class="content">';
        echo $content;
        echo '</div>';      

    }

¡Espero que esto ayude!

14 may 2012 19:33:06
Comentarios

Un error 404 no es un problema de plantilla - la página 404 solo se utiliza si no se puede encontrar/determinar el contenido. Si WordPress no puede encontrar la plantilla, recurre a una plantilla más genérica según la jerarquía de plantillas. Además - en la plantilla no necesitas usar get_pages o get_posts - WordPress ya habrá recuperado el contenido de la base de datos y solo necesita un bucle have_posts() para mostrarlo.

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