2009-10-23 7 views
6
collegamento

sito: http://nuestrafrontera.org/wordpress/Aiuto per modificare il widget Messaggi recenti Wordpress per diplay in tutte le 3 lingue in una sola volta

voglio il feed dei recenti titoli dei post per mostrare nella barra laterale per tutti i 3 lingue, separati per lingua. Così, per esempio, sotto Messaggi recenti la barra laterale avrebbe "inglese" e poi gli ultimi 3 post in inglese, poi "Español" e gli ultimi 3 in spagnolo e poi in francese. Tutto in un elenco nella colonna e visualizzato su tutte le pagine con la barra laterale in tutte le lingue.

Sto usando la versione più recente di Wordpress con il plugin WPML.

Credo che il widget di Wordpress per i post recenti debba essere ottimizzato per fare ciò. Ecco il codice (da wp-includes/default-widgets.php):

class WP_Widget_Recent_Posts extends WP_Widget { 

    function WP_Widget_Recent_Posts() { 
     $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __("The most recent posts on your blog")); 
     $this->WP_Widget('recent-posts', __('Recent Posts'), $widget_ops); 
     $this->alt_option_name = 'widget_recent_entries'; 

     add_action('save_post', array(&$this, 'flush_widget_cache')); 
     add_action('deleted_post', array(&$this, 'flush_widget_cache')); 
     add_action('switch_theme', array(&$this, 'flush_widget_cache')); 
    } 

    function widget($args, $instance) { 
     $cache = wp_cache_get('widget_recent_posts', 'widget'); 

     if (!is_array($cache)) 
      $cache = array(); 

     if (isset($cache[$args['widget_id']])) { 
      echo $cache[$args['widget_id']]; 
      return; 
     } 

     ob_start(); 
     extract($args); 

     $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title']); 
     if (!$number = (int) $instance['number']) 
      $number = 10; 
     else if ($number < 1) 
      $number = 1; 
     else if ($number > 15) 
      $number = 15; 

     $r = new WP_Query(array('showposts' => $number, 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1)); 
     if ($r->have_posts()) : ?> 
     <?php echo $before_widget; ?> 
     <?php if ($title) echo $before_title . $title . $after_title; ?> 
     <ul> 
     <?php while ($r->have_posts()) : $r->the_post(); ?> 
     <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if (get_the_title()) the_title(); else the_ID(); ?> </a></li> 
     <?php endwhile; ?> 
     </ul> 
     <?php echo $after_widget; ?> 
<?php 
      wp_reset_query(); // Restore global post data stomped by the_post(). 
     endif; 

     $cache[$args['widget_id']] = ob_get_flush(); 
     wp_cache_add('widget_recent_posts', $cache, 'widget'); 
    } 

    function update($new_instance, $old_instance) { 
     $instance = $old_instance; 
     $instance['title'] = strip_tags($new_instance['title']); 
     $instance['number'] = (int) $new_instance['number']; 
     $this->flush_widget_cache(); 

     $alloptions = wp_cache_get('alloptions', 'options'); 
     if (isset($alloptions['widget_recent_entries'])) 
      delete_option('widget_recent_entries'); 

     return $instance; 
    } 

    function flush_widget_cache() { 
     wp_cache_delete('widget_recent_posts', 'widget'); 
    } 

    function form($instance) { 
     $title = esc_attr($instance['title']); 
     if (!$number = (int) $instance['number']) 
      $number = 5; 
?> 
     <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label> 
     <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p> 

     <p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to show:'); ?></label> 
     <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /><br /> 
     <small><?php _e('(at most 15)'); ?></small></p> 
<?php 
    } 
} 
+0

sono le diverse lingue tracciati come categorie? Non ho familiarità con WPML ... –

+0

Con WPML, quasi tutto può essere definito dalla lingua e per cose come post/pagine e categorie, è possibile indicare che una categoria è la traduzione di un'altra in una lingua diversa. – CreativEliza

risposta

0

io non sono a conoscenza WPML plug-in, ma se avete la lingua categorie specifiche, si può semplicemente fare questo:

... 
<ul class="recent-english-posts"> 
<?php 
    $loop = new WP_Query('cat=' . get_category_by_slug('english')->term_id . '&showposts=3'); 
    if($loop->have_posts()): while($loop->have_posts()): $loop->the_post(); 
?> 
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> 
<?php endwhile; else: ?> 
    No English posts yet! 
<?php endif; ?> 
</ul> 
... 
<ul class="recent-spanish-posts"> 
<?php 
    $loop->query('cat=' . get_category_by_slug('spanish')->term_id . '&showposts=3'); 
    if($loop->have_posts()): while($loop->have_posts()): $loop->the_post(); 
?> 
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> 
<?php endwhile; else: ?> 
    No Spanish posts yet! 
<?php endif; ?> 
</ul> 
... 
<ul class="recent-espanol-posts"> 
<?php 
    $loop->query('cat=' . get_category_by_slug('espanol')->term_id . '&showposts=3'); 
    if($loop->have_posts()): while($loop->have_posts()): $loop->the_post(); 
?> 
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> 
<?php endwhile; else: ?> 
    No Espanol posts yet! 
<?php endif; ?> 
</ul> 
... 

Inserendo questo codice nel tema sidebar.php, si spera che lo si sia fatto. Ma cosa succede se lo vuoi come widget? ci sono due soluzioni per la mia mente:

Prima Soluzione: come hai detto in precedenza nell'aggiornamento della domanda, puoi inserire il nucleo! & cambia il widget di post recenti di WordPress standard. Qui si va sostituendo il metodo originale widget() della classe WP_Widget_Recent_Posts:

... 
function widget($args, $instance) { 
     $cache = wp_cache_get('widget_recent_posts', 'widget'); 

     /* pre-saving language-specific ids for ease of use & code readability ofcourse! */ 
     $cat_ids = array(
         'en'=>get_category_by_slug('english')->term_id, 
         'sp'=>get_category_by_slug('spanish')->term_id, 
         'es'=>get_category_by_slug('espanol')->term_id 
         ); 

     if (!is_array($cache)) 
       $cache = array(); 

     if (isset($cache[$args['widget_id']])) { 
       echo $cache[$args['widget_id']]; 
       return; 
     } 

     ob_start(); 
     extract($args); 

     $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title']); 
     if (!$number = (int) $instance['number']) 
       $number = 10; 
     else if ($number < 1) 
       $number = 1; 
     else if ($number > 15) 
       $number = 15; 

     /* recent english posts loop */ 
     $r = new WP_Query(array('cat' => $cat_ids['en'], 'showposts' => $number, 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1)); 
     if ($r->have_posts()) : ?> 
     <?php echo $before_widget; ?> 
     <?php if ($title) echo $before_title . $title . $after_title; ?> 
     <ul> 
     <?php while ($r->have_posts()) : $r->the_post(); ?> 
     <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if (get_the_title()) the_title(); else the_ID(); ?> </a></li> 
     <?php endwhile; ?> 
     </ul> 

     /* recent spanish posts loop */ 
     $r->query(array('cat' => $cat_ids['sp'], 'showposts' => $number, 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1)); 
     if ($r->have_posts()) : ?> 
     <?php echo $before_widget; ?> 
     <?php if ($title) echo $before_title . $title . $after_title; ?> 
     <ul> 
     <?php while ($r->have_posts()) : $r->the_post(); ?> 
     <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if (get_the_title()) the_title(); else the_ID(); ?> </a></li> 
     <?php endwhile; ?> 
     </ul> 

     /* recent espanol posts loop */ 
     $r->query(array('cat' => $cat_ids['es'], 'showposts' => $number, 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1)); 
     if ($r->have_posts()) : ?> 
     <?php echo $before_widget; ?> 
     <?php if ($title) echo $before_title . $title . $after_title; ?> 
     <ul> 
     <?php while ($r->have_posts()) : $r->the_post(); ?> 
     <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if (get_the_title()) the_title(); else the_ID(); ?> </a></li> 
     <?php endwhile; ?> 
     </ul> 

     <?php echo $after_widget; ?> 
<?php 
       wp_reset_query(); // Restore global post data stomped by the_post(). 
     endif; 

     $cache[$args['widget_id']] = ob_get_flush(); 
     wp_cache_add('widget_recent_posts', $cache, 'widget'); 
    } 
... 

Ma non si preferisce utilizzare una soluzione del genere, cambiando il nucleo non è una buona idea! Anche questa potrebbe essere una cattiva pratica a causa di motivi di portabilità, mentre è possibile riscrivere i widget di WordPress!

La seconda soluzione, ancora preferibile! In functions.php posto di vostro tema il codice qui sotto:

<?php 
    function widget_mytheme_recent_posts(){ 
?> 

    <!-- your new widget code will go there 
      replace this comment by the first block of code in this answer, 
      take care of php code blocks! --> 

<?php    
    } //end of widget_mytheme_recent_posts() 

    if(function_exists('register_sidebar_widget')) 
     register_sidebar_widget(__('Recent Posts'), 'widget_mytheme_recent_posts'); 

    /* the rest of functions.php code will go here, maybe sidebar registering! */ 
?> 

La speranza è aiutare;)

+0

Vedere la tabella 'posts' e vedere se WPML ha modificato la tabella aggiungendo un campo di lingua o no – sepehr

+0

Non sono un programmatore di per sé ma piuttosto mi ingegnerò il codice finché non funziona. Quindi, scusa la mia ignoranza, ma dove posso vedere la tabella dei post? – CreativEliza

+1

Ho appena letto il tuo commento sulla domanda che menziona che sono disponibili categorie specifiche della lingua durante l'utilizzo di WPML, quindi il modo migliore per fare ciò che vuoi è il codice qui sopra! sostituisci la categoria slug con la tua categoria slug di una lingua e posizionala nella barra laterale. dal modo in cui puoi vedere le strutture delle tabelle MySQL usando cli, phpMyAdmin, Navicat Lite per MySQL, ecc. http://bit.ly/3rAIx1 – sepehr

Problemi correlati