Cómo aplicar plantilla personalizada tanto categorías como subcategorías…

Inicio Foros WordPress Programación Cómo aplicar plantilla personalizada tanto categorías como subcategorías…

Este debate contiene 28 respuestas, tiene 3 mensajes y lo actualizó  imported_fliberty hace 7 años, 7 meses.

  • Autor
    Publicaciones
  • #20967

    imported_fliberty
    Participante

    <p>Hola a todos, los que ya hayan visitado mi página y visto los cambios realizados en base a la consulta sobre categorías hijo, que he realizado, comprenderán el porqué de la pregunta.</p>
    <p>Buscando la solución a una pregunta que planteara en:<br />
    http://ayudawp.com/foro/topic/ayuda-con-categorias-hijo</p&gt;
    <p>No se me ocurrió mejor forma que aplicarla a mi página, antes de utilizarla en el diseño del theme que se está por realizar.<br />
    Para ello realicé el diseño de una plantilla personalizada para la categoría películas; y aunque anteriormente no contaba con sub categorías, le tuve que asignar subcategorías para poder aplicar dicho código.</p>
    <p>Ahora al ver el resultado y la verdad es que me agrada, quisiera saber como puedo realizar para que el formato aplicado a la categoría películas sea aplicado también a todas su categorías hijo; como ustedes se darán cuenta en: http://www.pachakamaq.com/peliculas, y notarán que hay tres entradas en la subcategoría "ciencia fícción", y si accedemos a esa subcategoria, el aspecto que tiene es el de el archivo de categorías y lo que yo quiero, es que tenga el mism aspecto de la plantilla personalizada.</p>
    <p>Muchas gracias por su atención…
    </p>

  • #51546

    LGrusin
    Miembro

    Hola fliberty, respondeme a una pregunta ¿Le has cambiado el enlace por defecto que viene con WordPress para las categorías? Me refiero a category que debería salir en la URL cuando se pulsa en una categoría.

    Digo esto porque estoy leyendo varias dudas sobre este tema y al parecer no les funcionan bien las categorías y subcategorías, me da la impresión de que los tiros van por ahí.

    Normalmente cuando se hace una pregunta en el Foro no se detallan estas cosas, con lo cual es muy difícil saber por qué no funcionan unos códigos que a otros les van perfectamente.

    Incluso si cambias el permalink afecta a los resultados de algunas funciones de WordPress.

    Llevo tiempo leyéndote y me extraña que no hayas encontrado una solución. De todas formas, investigaré y te diré lo que averigue.

    Un saludo

  • #51548

    almendron
    Participante

    Crea un archivo y llamalo [b]category.php[/b]. Aplica el código de la plantilla personalizada al nuevo archivo.

  • #51553

    imported_fliberty
    Participante

    Que tal LGrusin, el permalink base de mis categorías es “seccion”, puede que sea por eso, pero también estoy investigando.
    Almendrón, bueno eso si lo entiendo, pero digamos que sólo quiero aplicar el mismo formato a la categoría películas y a sus subcategorías, entonces tendría que hacer una plantilla para cada una de ellas, así digamos que tendría un promedio de 10 plantillas.

  • #51554

    imported_fliberty
    Participante

    LGrusin, nuevamente aquí, si el problema se debe a como tu dices, por el cambio realizado en la base de category a seccion, piensas que se solucionaría si regreso a su base original, es decir “category”; teniendo en cuenta además que estoy haciendo una redirección 301 para ello:

    RewriteRule ^category/(.+)$ http://www.pachakamaq.com/seccion/$1 [R=301,L]

    Supongo que de regresar a su versión original, la redirección sería algo como:

    RewriteRule ^seccion/(.+)$ http://www.pachakamaq.com/category/$1 [R=301,L]

  • #51559

    almendron
    Participante

    Pues entonces, prueba a usar <?php include (TEMPLATEPATH . '/peliculas.php'); ?> donde “peliculas.php” incluiría todo solo el código personalizado. Después, en “archive.php” modificas la sección “is_category” para que ejecute el código de “peliculas.php” cuando se trate de una categoría determinada. En este caso la de “peliculas”. Para las categorías hijas lo ideal sería hacerlo de forma automática. Sería extrayendo el ID o el slug de la categoría padre y aplicar solo el template cuando devolviera “peliculas”. El problema es que solo conozco una función que devuelva la categoría padre “get_category_parents” pero su salida es una lista que incluye tanto la padre como la hijas.

    Mira a ver si este código devuelve el nombre de la primera categoría, es decir, de la categoría padre:

    <?php
    $category = get_category_parents($cat, FALSE);
    echo $category[0]->cat_name;
    ?>

    Si lo hace bien, la estructura en archive.php (sección is_category):

    1.- Extraemos el nombre de la categoría (single_cat_title).

    2.- Si es igual a “peliculas”, usamos <?php include (TEMPLATEPATH . '/peliculas.php');

    3.- Si no es igual a “peliculas”, entonces extraemos el nombre de la categoría padre. Si éste es igual a películas, hacemos lo mismo que en el punto anterior.

    Nota: según el codex, TEMPLATEPATH es una referencia al camino absoluto al directorio de tema activo (sin el / al final)

    http://codex.wordpress.org/es:Include_Tags

  • #51564

    imported_fliberty
    Participante

    Si en eso estaba pensando, en algo parecido, es decir en el category.php colocar una función como <?php if(is_category(‘peliculas’) && is_category(‘drama’)){ ?><?php include(‘peliculas.php’); ?><? } else { ?>resto de codigo normal <?php } ?>

    Pero lo que quisiera saber si sería correcto utilizar && para indicar que también se deben tener en cuenta esas categorías.

  • #51566

    almendron
    Participante

    No te sirve && porque devuelve verdadero cuando ambas condiciones son verdaderas. Deberías usar || que devuelve verdadero cuando al menos una de las condiciones es verdadera.

    Yo sigo prefiriendo hacerlo de forma automática porque así no tienes que estar pendiente de corregir el código si el día de mañana añades una nueva categoría hija. Corrijo el código que te he puesto antes:

    <?php
    $current_category = single_cat_title("", false);
    $cat = get_cat_ID($current_category);
    $category = get_category_parents($cat, FALSE);
    echo $category[0]->cat_name;
    ?>

    Si el echo devuelve el nombre de la categoría padre, ya lo tienes para hacerlo de forma automática.

  • #51567

    imported_fliberty
    Participante

    Si utilizo el código que mencionas, como sería en todo caso la implementación, de tal forma que sólo la categoría películas y sus subcategorías tengan ese formato, exceptuando las demás categorías.

  • #51569

    almendron
    Participante

    Como ya he comentado, estoy de vacaciones y no puedo comprobar el código lo que me hace ser cauto no vaya a ser que diga alguna barbaridad. No obstante, intentaré darte la idea:

    1) Supongamos que el código que he puesto devuelve el nombre de la categoría padre.

    2) Cambiamos echo $category[0]->cat_name; por $category[0]->cat_name;. Doy también por hecho (habría que comprobarlo) que $category a secas (sin el [0])almacena el nombre de la categoría padre.

    Quedaría así:

    <?php
    $current_category = single_cat_title("", false);
    $cat = get_cat_ID($current_category);
    $category = get_category_parents($cat, FALSE);
    $category[0]->cat_name;
    ?>

    3) Tendríamos, por tanto, $current_category que almacena el nombre de la categoría actual y $category que almacena el nombre de la categoría padre.

    Te pongo el resto de código de forma esquemática:

    if ($current_category == 'peliculas') || ($category == 'peliculas')
    plantilla personalizada
    else
    código normal
    endif

    En la primera línea me queda la duda si hay que usar ($category == 'peliculas') o ($category[0] == 'peliculas')

    Por último, comprueba si $current_category y $category devuelve el nombre o el slug de la categoría.

  • #51571

    imported_fliberty
    Participante

    Bueno yo también quisiera estar de vacaciones pero como trabajo de manera libre no puedo darme ese lujo, jejejeje, hay niños que mantener…

    Voy a revisar lo que me indicas y ver las posibles modificaciones si las hubiere, si funciona, molesto nuevamente por otra inquietud que aún no quiero abordar.

  • #51572

    imported_fliberty
    Participante

    Estoy probando el código, y me sale un error en esta línea:
    if ($current_category == ‘peliculas’) || ($category == ‘peliculas’)

    syntax error unexpected t_boolean_or

    Supongo que es por ||.

  • #51573

    almendron
    Participante

    Ya sabía yo que me confundiría en algo. Desde que uso esos editores que dicen cuando es errónea la sintaxis, se me está olvidando todo 🙂

    Son los paréntesis. Y por cierto, creo que single_cat_title como get_category_parents devuelve el nombre y no el slug. Suponiendo que sea “Películas”, el código quedaría así:

    if ($current_category == 'Películas' || $category == 'Películas')

  • #51574

    imported_fliberty
    Participante

    Voy a revisar y te comento, ya que ahora mismo estoy fuera. Muchas gracias…

  • #51575

    imported_fliberty
    Participante

    Haber estoy probando el código que me mencionas y bueno no funciona, es decir cuando abro la categoría películas se muestra la plantilla deseada, pero aún en otras categorías se muestra esa plantilla.

    Quiero que me corrijas por si esté haciendo algo mal; digamos que en el archivo category.php ó archive.php hago lo siguiente:

    Hay que tener en cuenta que el archivo peliculas.php es completo incluyendo las llamadas al header y al footer.

    Espero me corrijas.

  • #51576

    imported_fliberty
    Participante

    Almendrón, corrijo mi respuesta anterior, ya que anteriormente estuve aplicando el código en el archivo category.php y ahora cambie a archive.php y funciona pero sólo para la categoría Películas, es decir si cambio a sub categorías como drama, acción, etc., esta toman la misma apariencia normal de las demás y no la de Películas, pero personalmente creo que poco a poco lo vamos logrando.
    Si me ayudas a lograr esto, te brindo unos 5 puntitos (aunque hasta ahora no entiendo mucho de que sirven, pero se ven bonitos)…

  • #51580

    LGrusin
    Miembro

    Este método va bien:

    Ejemplo, suponiendo una categoria llamada Documentos que tiene ID 12. Si es la categoría Documentos o una subcategoria de ella

    Esto se coloca en archive.php o category.php
    Por supuesto, debe existir category-loquesea.php que es la plantilla para esa categoría y sus subcategorías.

    Un saludo

  • #51583

    almendron
    Participante

    Tal y como has puesto el código, no debería funcionar en ningún sitio. El lugar indicado es archive.php:

    1) Antes del código que has puesto debe ir un “if (is_category())” o te ejecutará el código en cualquier página de archivo. Al incluir esa condición, solo lo hará cuando accedas a una categoría.

    De forma esquemática:

    if (is_category())
    código personalizado
    else
    resto de código de archive.php (lo normal sería que hubiera algo relativo a category en este archivo. Debes quitarlo).

    2) La llamada a peliculas.php no es la correcta según el codex. Sería:

    <?php include (TEMPLATEPATH . '/peliculas.php');

    3) Prueba a poner $category == 'Películas' , es decir sin el [0]. Se supone que ésto es solo para que devuelva el primer nombre de la lista.

    4) Voy a bajarme un editor de php a ver si así puedo ayudarte de forma más efectiva.

  • #51584

    almendron
    Participante

    Si sabes de algún editor gratuito que corrija la sintaxis, me lo dices y lo instalo. He mirado varios pero requieren tener instalado un servidor local para que cumpla esa función.

  • #51585

    almendron
    Participante

    LGrusin: pues ya te podías haber pasado antes por el hilo jajajaja

    Solo tengo una duda en relación al código que has puesto y es con $cat. ¿Funciona en automático o hay que hallar su valor? Si fuera lo segundo, creo que valdría con

    $current_category = single_cat_title("", false);
    $cat = get_cat_ID($current_category);
    <?php if (cat_is_ancestor_of(12, $cat) or is_category(12)) {
    $template = TEMPLATEPATH . '/peliculas.php';
    load_template($template);
    }
    ?>

  • #51592

    imported_fliberty
    Participante

    Haber estoy aquí:

    archive.php

    <?php
    $current_category = single_cat_title(“”, false);
    $cat = get_cat_ID($current_category);
    if (cat_is_ancestor_of(534, $cat) or is_category(534)) {
    $template = TEMPLATEPATH . ‘/peliculas.php’;
    load_template($template);
    } else {
    ?>
    Contenido normal del archive.php
    <?php } ?>

    Donde:534 es el ID de la categoría películas.

    Funcionando perfectamente; al inicio cuando accedia a una de las subcategorías me mostraba las mismas entradas de la categoría principal.

    Causa: query del slider que mostraba las entradas de la categoría 534.
    Solución: resetear la query: <?php endwhile; wp_reset_query(); ?>

    Pregunta: Cómo obtengo la ID de la categoría actual para ser usada en el slider: <?php query_posts(‘cat=534&showposts=10’); ?> Para introducir automáticamente el ID de la categoría actual.?

    Muchas gracias compañeros, tienen 5 puntitos cada uno, independientemente si me ayudan o no con esta última pregunta.

  • #51593

    imported_fliberty
    Participante

    Ya solucioné la última pregunta, pero por si me encuentre haciendo idioteces, aqui la solución:

    La query del slider lo reemplacé por esto:
    <?php
    $current_category = single_cat_title(“”, false);
    $cat = get_cat_ID($current_category);
    query_posts(‘cat=’.$cat.’&showposts=44&paged=$paged’); ?>

    Según como entendí de todos sus aportes:
    $current_category = single_cat_title(“”; false); //Indica la categoría actual.
    $cat = get_cat_ID($current_category); //Se obtiene el ID de la categoría y se almacena en la variable $cat

    Para imprimir el ID de la categoría sólo se debe llamar la variable donde se almacenó el ID, que es $cat.

    Si existe algún error en la forma de como lo he implementado y piensan que hay alguna mejor, espero que me puedan ayudar, muchas gracias.

    PD. Quería indicar que lo mismo estoy haciendo en la plantilla peliculas.php, y bueno en este caso la paginación falla, y necesito su ayuda.

    Pueden checar como queda en: [url=http://www.pachakamaq.com/?cat=18]Peliculas en Pachakamaq[/url]

  • #51594

    almendron
    Participante

    ufffffffff… ya me he perdido 😀

    Lo de

    $current_category = single_cat_title(""; false); //Indica [b]el nombre[/b] de la categoría actual.
    $cat = get_cat_ID($current_category); //Se obtiene el ID de la categoría y se almacena en la variable $cat

    es correcto.

    En cuanto a los puntos, no te preocupes que no lo hacemos por eso 😉

  • #51595

    imported_fliberty
    Participante

    Se entiende almendrón, pero quería dárselos por la ayuda… Como mencioné no se para que sirven, al fin cuando uno ayuda, no lo hace por recibir algo a cambio…

    Le mencionaba que ya esta listo, y les indicaba donde ver el resultado, el hecho es que al utilizar el código para insertar el ID de la categoría en el query, me genera un error de paginación que quisiera resolver, ya que me interesa mostrar 40 entradas sólo en la categoría películas y sus subcategorías para que el sidebar no se vea muy largo, mientras que en las demás se muestre una cantidad normal.

  • #51596

    almendron
    Participante

    Ya lo siento pero lo del error en la paginación supera mis conocimientos. Lo máximo que he hecho sobre ese asunto ha sido obtener la página en la que me encontraba para construir una ruta. La paginación propiamente dicha la hago con el plugin WP-PageNavi.

    Te pongo el código para que lo veas por si te da alguna pista:

    <?php
    $query = $GLOBALS['wp_query'];
    $paged = max( 1, absint( $query->get( 'paged' ) ) );
    $total_pages = max( 1, absint( $query->max_num_pages ) );
    $paginas = 'Página ' . $paged . ' de ' . $total_pages;
    ?>

    Esto solo devuelve la página en la que te encuentras. Puedes ver un ejemplo en

    http://www.almendron.com/tribuna/date/2011/03/page/7/ (al final de la página).

  • #51598

    imported_fliberty
    Participante

    La paginación también lo hago con pagenavi integrado al theme, pero tengo esto:

    function movies_pagination(&$query) {
    if ( $query->is_category(534) ) {
    $query->set(‘posts_per_page’, 16);
    }
    }

    add_filter(‘pre_get_posts’,’movies_pagination’);

    Funciona perfectamente, pero como podríamos hacerlo para que también aplique a las subcategorías de la categoría 534 (peliculas)?.

  • #51599

    imported_fliberty
    Participante

    Tratando de fusionar la función utilizada en archive.php para cargar la plantilla peliculas, he modificado la función anterior y me quedó lo siguiente:

    function movies_pagination(&$query) {
    $current_category = single_cat_title(“”, false);
    $cat = get_cat_ID($current_category);
    if ($query -> is_category(534) || cat_is_ancestor_of(534, $cat)){
    $query->set(‘posts_per_page’, 16);
    }
    }

    add_filter(‘pre_get_posts’,’movies_pagination’);

    Nótese que reemplacé: cat_is_ancestor_of(534, $cat) or is_category(534) por is_category(534) || cat_is_ancestor_of(534, $cat) y por el momento me está funcionando.

    Ver resultados en: [url=http://www.pachakamaq.com/seccion/multimedia/peliculas-multimedia]Películas en Pachakamaq[/url]

  • #51600

    almendron
    Participante

    Me alegro de que te funcione. Enhorabuena.

    Por cierto, si te decides a poner películas o series en HD, ya me avisarás. Aquí, en España, es muy posible que a partir de dentro de dos meses cierren las páginas más importantes de descargas y habrá que buscar alternativas.

    Un saludo.

  • #51601

    imported_fliberty
    Participante

    Sí, así parece, me dediqué a brindarle una mejor apariencia a esta categoría, por el hecho de querer publicar un poco más sobre el rubro, hasta que aqui nos restringan la publicación de este tipo de material.

    Ahora sólo me falta encontrar solución a esto: http://ayudawp.com/foro/topic/como-limito-el-numero-de-post-de-algunas-categorias-en-el-home

El foro ‘Programación’ está cerrado y no se permiten nuevos debates ni respuestas.

Pin It on Pinterest