Páginas

lunes, 28 de agosto de 2017

Como mostrar en la página de inicio de Wordpress los temas recientes desde una categoría de posts y una página interna

Logo wordpress  Antes que nada una disculpa por no publicar antes y tener un "poquito" abandonado este blog, lo que sucede es que he tenido trabajo que atender y a veces es difícil querer hacer dos o tres cosas a la vez. Bueno pues, ya estamos de regreso, como comentaba anteriormente estoy publicando algunos truquitos para mejorar nuestros temas de Wordpress y otras utilidades; en esta ocasión voy a mostrar como tener en nuestra página de inicio de Wordpress los últimos posts de una categoría, pero también lo que se publique en páginas internas y que queramos presentarlo como novedad. Te invito a que sigas leyendo por favor este tutorial y dejes tus comentarios.

Publicidad


  Como sabemos Wordpress es un sistema prearmado en PHP que nos permite montar nuestro sitio web en muy poco tiempo, para ello se vale del uso de temas para crear la interfaz de la web que queremos, estos son simples archivos PHP que podemos editar a nuestro gusto si es que no estamos del todo satisfechos con el tema instalado, o queremos personalizarlo.

  Típicamente el archivo que despliega la página principal de nuestro tema se llama "index.php", si queremos mostrar no solo los últimos temas publicados dentro de una categoría (posts), sino también el contenido de una página interna (o varias), vamos a ver entonces como lo podemos hacer.
   Pero antes que nada vamos a aclarar para que podríamos querer o como nos beneficiaría este truco. Bueno, esto no es algo muy común. Hace poco diseñé una tienda online para un cliente, dentro de sus especificaciones es que tenía que estar montada en Wordpress para poderla manejar con facilidad (cosa que no objeté), pero en la página de inicio no solo debían aparecer los últimos posts de una categoría en particular (News), sinó mostrarse el contenido de dos páginas web internas, una para lanzamientos y otra para multimedia. ¿Porqué razón no se hicieron como posts y mostrar únicamente los últimos posts de esas categorías?, pues requerimientos del cliente, básicamente.Sonrisa

Entonces ya explicado el punto, el truco es el siguiente:

  • Abrimos el archivo index.php con nuestro editor de textos favorito.
  • Nos posicionamos en donde se va a empezar a mostrar el listado de los últimos posts, hay que quitar el código fuente que venga en ese tema (varía de posición y forma en cada tema, esto es una especificación general, cada tema tenemos que estudiarlo un poco antes de ver donde vamos a insertar esto).
  • Reemplazamos por lo siguiente:

<? php

         // Gracias a https://stackoverflow.com/questions/41886528/wordpress-how-to-filter-posts-by-category-using-wp-query
        // Gracias a https://wordpress.stackexchange.com/questions/59407/shortcode-using-multiple-wp-querys-with-multiple-category-names-not-fully-funct
       $args1 = array (
    'category_name' => 'News',
            'post_status' => 'publish',
            'orderby' => 'post_modified',
            'order' => 'DESC'
       );

       $args2 = array (
           'post_type' => 'page',
           'pagename' => 'Releases',
           'post_status' => 'publish',
           'orderby' => 'post_modified',
           'order' => 'DESC'
     );

        $args3 = array (
           'post_type' => 'page',
           'pagename' => 'Media',
           'post_status' => 'publish',
           'orderby' => 'post_modified',
           'order' => 'DESC'
     );

       $the_query[0] = array(
              "ID" => "",
                "post_author" => "",
                "pst_date" => "",
                "post_date_gmt" => "",
                "post_conten" => "",
                "post_title" => "",
                "post_excerpt" => "",
                "post_status" => "",
                "comment_status" => "",
                "ping_status" => "",
                "post_password" => "",
                "post_name" => "",
                "to_ping" => "",
                "pinged" => "",
                "post_modified" => "",
                "post_modified_gmt" => "",
                "post_content_filtered" => "",
                "post_parent" => "",
                "guid" => "",
                "menu_order" => "",
                "post_type" => "",
                "post_mime_type" => "",
                "comment_count" => "",
                "filter" => ""
        );                                                 
                                                                            
       $the_query1 = new WP_Query( $args1 );
       $the_query2 = new WP_Query( $args2 );
       $the_query3 = new WP_Query( $args3 );
          
       foreach($the_query1->posts as $item)
           array_push($the_query, $item);
            
       foreach($the_query2->posts as $item)
          array_push($the_query, $item);
            
       foreach($the_query3->posts as $item)
          array_push($the_query, $item);
            
       sortArrayByKey($the_query,"post_modified",true,false);
        
       if( !empty($the_query) )
           if ( is_home() && ! is_front_page() )
           {

                   echo "<header>"."\n";
                   echo "<h1>".$the_query[0]["post_title"]."</h1>"."\n";
                   echo "</header>"."\n";

                 //thanks to https://wordpress.stackexchange.com/questions/30694/manually-set-global-post-vars-with-an-id-in-order-to-use-template-tags
                 foreach($the_query as $query)
                 {
            
                    global $post;
            
                    if(trim($query->ID) != "")
                    {
                  
                        $post = get_post($query->ID);
                        setup_postdata( $post );
              
                        get_template_part( 'template-parts/content', get_post_format() );
                
                        wp_reset_postdata();
                  
                    }
                
                 }

          }
          else
              get_template_part( 'template-parts/content', 'none' );
       
   ?>

  • Guardamos cambios y probamos en el navegador web

Función sortArrayByKey (esta la colocamos en otro archivo, functions.php por ejemplo)

 //thanks to https://stackoverflow.com/questions/4282413/sort-array-of-objects-by-object-fields
function sortArrayByKey(&$array, $key, $string = false, $asc = true)
{

     if($string)
    {
   
       usort($array,function ($a, $b) use(&$key,&$asc)
       {
   
           if($asc)
              return strcmp(strtolower($a->{$key}), strtolower($b->{$key}));
           else
              return strcmp(strtolower($b->{$key}), strtolower($a->{$key}));
             
        });
       
    }
    else
    {
     
      usort($array,function ($a, $b) use(&$key,&$asc)
      {
           
            if($a[$key] == $b->{$key})
                return 0;
               
            if($asc)
              return ($a->{$key} < $b->{$key}) ? -1 : 1;
            else
              return ($a->{$key} > $b->{$key}) ? -1 : 1;

       });
   
    }

}

  Como podemos ver, se trata de traer mediante una consulta los últimos posts desde la categoría News, el contenido de las páginas Releases y Media, combinar todo eso en un array y luego ordenarlo por fecha, así cada vez que halla nuevos posts o cambios en esas páginas se reflejará todo en la página de inicio.

  Finalmente, mediante el archivo template-parts/content (content.php) vamos a mostrar el contenido de nuestro arreglo (ahora insertado en $post), este tema personalizado se base en Twenty Sixteen de Wordpress, por lo que si lo usas ya tienes la estructura de los archivos lista.

Procedencia de las imágenes:
File: Logo base de datos 
URL:  https://s.w.org/about/images/logos/wordpress-logo-simplified-rgb.png
Licencia: Creative Commons

¿Te gustó este post?, entonces si lo deseas puedes apoyarnos para continuar con nuestra labor, gracias.