Helfen Sie mit, das WordPress-Widget „Neueste Beiträge“ so zu bearbeiten, dass es in allen 3 Sprachen gleichzeitig angezeigt wird

Lesezeit: 10 Minuten

Benutzer-Avatar
KreativEliza

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

  • 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

Benutzer-Avatar
sepehr

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 😉

  • Siehe die posts Tabelle und prüfen Sie, ob WPML die Tabelle geändert hat und ein Sprachfeld hinzugefügt hat oder nicht

    – sepehr

    24. Oktober 2009 um 0:25 Uhr

  • Ich bin per se kein Programmierer, sondern tüftle am Code herum, bis es funktioniert. Also entschuldigen Sie meine Unwissenheit, aber wo kann ich die Beitragstabelle sehen?

    – CreativEliza

    24. Oktober 2009 um 13:10 Uhr

  • Ich habe gerade Ihren Kommentar zu der Frage gelesen, in dem erwähnt wird, dass bei der Verwendung von WPML sprachspezifische Kategorien verfügbar sind. Der beste Weg, das zu tun, was Sie tun möchten, ist der obige Code! Ersetzen Sie den Kategorie-Slug durch Ihren Kategorie-Slug einer Sprache und platzieren Sie ihn in der Seitenleiste. Übrigens können Sie die MySQL-Tabellenstrukturen mit cli, phpMyAdmin, Navicat Lite für MySQL usw. anzeigen. bit.ly/3rAIx1

    – sepehr

    25. Oktober 2009 um 18:01 Uhr

  • Nun, hier ist der Haken, wie sie sagen. Die Seitenleiste wird in WordPress dynamisch erstellt, sodass ich nicht einfach PHP-Code einfügen kann. Aus diesem Grund versuche ich, einen Weg zu finden, das Widget zu optimieren, da dies Teil der dynamischen Seitenleiste ist.

    – CreativEliza

    25. Oktober 2009 um 20:17 Uhr

  • Ich schätze Ihre Hilfe sehr, aber ich fürchte, das ist außerhalb meiner Liga. Ich habe versucht, genau das zu tun, was Sie gesagt haben, aber ich habe jedes Mal PHP-Fehler bekommen. Ich bin mir sicher, dass ich den Code einfach nicht richtig einfüge, aber ich konnte nur ein oder zwei Codezeilen erfolgreich ändern, daher ist dies meiner Meinung nach zu komplex. Ich hatte gehofft, es wäre eine einfache Änderung wie das Hinzufügen eines language=”all” irgendwo, aber jetzt weiß ich, warum ich eher ein Designer als ein Techniker bin.

    – CreativEliza

    26. Oktober 2009 um 18:02 Uhr

1377450cookie-checkHelfen Sie mit, das WordPress-Widget „Neueste Beiträge“ so zu bearbeiten, dass es in allen 3 Sprachen gleichzeitig angezeigt wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy