views:

1836

answers:

2

Site link: http://nuestrafrontera.org/wordpress/

I want the feed of recent post titles to show in the sidebar for all 3 languages, separated by language. So, for example, under Recent Posts the sidebar would have "English" and then the latest 3 posts in English, then "Español" and the latest 3 in Spanish and then French. All in a list in the column and appearing on all pages with the sidebar in all languages.

I am using the most current version of Wordpress with the WPML plugin.

I believe the Wordpress widget for Recent Posts needs to be tweaked to do this. Here is the code (from 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
    }
}
+4  A: 

I'm not familiar with WPML plugin but if you have language specific categories, you can simply do that:

...
<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>
...

By placing this code in your theme sidebar.php you'll hopefully done. But what if you want this as a widget? there are two solutions on my mind:

First Solution: As you previously mentioned in your question update, you can fork the core! & change the standard WordPress recent posts widget. Here you go by replacing the original widget() method of the WP_Widget_Recent_Posts class:

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

But I do not prefer to use such a solution, changing the core is not a good idea! Also this could be a bad practice due to portability reasons while you can rewrite WordPress widgets!

The second, yet preferable solution! In your theme's functions.php place the code below:

<?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! */
?>

Hope it help ;)

Sepehr Lajevardi
See the `posts` table and see if WPML altered the table adding a language field or not
Sepehr Lajevardi
I'm not a programmer per se but rather I tinker at the code until it works. So, excuse my ignorance but where can I see the posts table?
CreativEliza
Sepehr Lajevardi
Well here is the rub as they say. The sidebar is dynamically created within Wordpress so I can't easily put PHP code into it. That's why I am trying to find a way to tweak the widget because that is part of the dynamic sidebar.
CreativEliza
Well, I'll update the answer asap ;)
Sepehr Lajevardi
I appreciate greatly your help but I'm afraid this is out of my league. I tried to do exactly what you said but I got PHP errors every time. I'm sure that I'm just not inserting the code right but I've only been successful at changing a line or two of code so this is too complex I think. I was hoping it was a simple change like adding a language="all" somewhere but now I know why I'm more of a designer than a tech person.
CreativEliza
Sighs, but this is how WordPress should handle this, loops! what kinda php errors you've got?!
Sepehr Lajevardi
ok let's get basic. you are talking about the functions.php page for the theme right? that has a bunch of code for editing the them. So do I put in the first part of the code at the beginning of file before everything? I tried that. Then you have a comment that says where the rest of the php code goes ending with the closing php tag. but if I do that, I get this error "Parse error: syntax error, unexpected T_STRING in /home/nuestraf/public_html/wordpress/wp-content/themes/fusion/functions.php on line 2". I am frustrated because I understand just enough to know that I'm doing something wrong.
CreativEliza
yeah, the `functions.php` of the theme. I don't know what that bunch of code is supposed to do with you theme, so I can't advice on where to put the code in functions.php till I read them. Since you're getting a syntax error, there might be no problem with the logic. check the first solution and change the WP native widget )
Sepehr Lajevardi
A: 

i wan edit Categories became chinese text, i have try edit,but have nothin changed

maureen