Seitenlink: http://nuestrafrontera.org/wordpress/
Ich möchte, dass der Feed der letzten Beitragstitel in der Seitenleiste für alle 3 Sprachen angezeigt wird, getrennt nach Sprache. Zum Beispiel würde die Seitenleiste unter den letzten Beiträgen „Englisch“ und dann die letzten 3 Beiträge auf Englisch, dann „Español“ und die letzten 3 auf Spanisch und dann Französisch haben. Alles in einer Liste in der Spalte und erscheint auf allen Seiten mit der Seitenleiste in allen Sprachen.
Ich verwende die aktuellste Version von WordPress mit dem WPML-Plugin.
Ich glaube, das WordPress-Widget für Recent Posts muss dafür optimiert werden. Hier ist der Code (aus 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="https://stackoverflow.com/questions/1615709/<?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
}
}
Ich bin mit dem WPML-Plugin nicht vertraut, aber wenn Sie sprachspezifische Kategorien haben, können Sie das einfach tun:
...
<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="https://stackoverflow.com/questions/1615709/<?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="https://stackoverflow.com/questions/1615709/<?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="https://stackoverflow.com/questions/1615709/<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; else: ?>
No Espanol posts yet!
<?php endif; ?>
</ul>
...
Indem Sie diesen Code in Ihr Thema einfügen sidebar.php
Sie werden hoffentlich fertig. Aber was ist, wenn Sie dies als Widget möchten? zwei Lösungen fallen mir ein:
Erste Lösung: Wie Sie bereits in Ihrem Fragen-Update erwähnt haben, können Sie den Kern forken! & ändern Sie das standardmäßige WordPress-Widget für die letzten Beiträge. Hier gehen Sie, indem Sie das Original ersetzen widget()
Methode der WP_Widget_Recent_Posts
Klasse:
...
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="https://stackoverflow.com/questions/1615709/<?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="https://stackoverflow.com/questions/1615709/<?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="https://stackoverflow.com/questions/1615709/<?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');
}
...
Aber ich ziehe es nicht vor, eine solche Lösung zu verwenden, das Ändern des Kerns ist keine gute Idee! Auch dies könnte aus Portabilitätsgründen eine schlechte Praxis sein, während Sie WordPress-Widgets umschreiben können!
Die zweite, aber vorzuziehende Lösung! In Ihrem Thema functions.php
Geben Sie den folgenden Code ein:
<?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! */
?>
Hoffe es hilft 😉
Werden die verschiedenen Sprachen als Kategorien verfolgt? Ich kenne mich mit WPML nicht aus…
– Paul Sheldrake
23. Oktober 2009 um 22:40 Uhr
Mit WPML kann fast alles nach Sprache definiert werden und für Dinge wie Beiträge/Seiten und Kategorien können Sie angeben, dass eine Kategorie die Übersetzung einer anderen in eine andere Sprache ist.
– CreativEliza
24. Oktober 2009 um 13:13 Uhr