2009-10-23 6 views
6

사이트 링크에서 3 개 언어으로 모니터하기 위해 최근 게시물 워드 프레스 위젯을 편집 : http://nuestrafrontera.org/wordpress/도움말 번

내가 최근 게시물 제목의 공급 언어로 구분 된 3 개 언어의 사이드 바에서 보여주고 싶어요. 예를 들어, Recent Posts에서 사이드 바에 "영어"가 표시되고 최근에 영어로 3 개의 게시물이 표시되고 "Español", 스페인어와 프랑스어로 최신 3 개가 표시됩니다. 열의 목록에있는 모든 항목으로 모든 언어로 된 세로 막대가있는 모든 페이지에 나타납니다.

저는 Wordpress의 최신 버전을 WPML 플러그인과 함께 사용하고 있습니다.

나는 이것을하기 위해 최근 포스트 용 Wordpress 위젯을 조정해야한다고 생각합니다. 여기에 (에서/기본 - widgets.php WP-포함) 코드입니다 : 내가 WPML 플러그인에 익숙하지 않아요하지만 당신은 언어 별 카테고리가있는 경우, 당신은 간단하게 할 수있는

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

범주로 추적 다른 언어인가

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

가 도움이 희망 : 코드 아래 테마의 functions.php 장소에서? 나는 WPML에 익숙하지 않다. ... –

+0

WPML을 사용하면 거의 모든 것이 언어로 정의 될 수 있으며, 게시물/페이지 및 카테고리와 같은 것에 대해서는 범주가 다른 언어의 다른 번역을 나타낼 수있다. – CreativEliza

답변

0

그 :

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

이 코드를 테마 sidebar.php에두면 잘 하셨을 것입니다. 그러나 이것을 위젯으로 원한다면 어떨까요? 내 마음에 두 가지 해결책이 있습니다.

첫 번째 해결 방법 : 이전에 질문에서 언급했듯이 코어를 포크 할 수 있습니다! & 표준 WordPress 최근 게시물 위젯을 변경하십시오. 다음은 WP_Widget_Recent_Posts 클래스의 원래 widget() 방법을 대체하여 이동 :

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

을하지만 이러한 솔루션을 사용하는 것을 선호하지 않는 코어를 변경하는 것은 좋은 생각이 아니다! 또한 이것은 워드 프레스 위젯을 다시 쓸 수있는 동안 이식성 때문에 나쁜 관행이 될 수 있습니다!

두 번째, 아직 바람직한 해결책! ;)

+0

'posts' 테이블을보고 WPML이 언어 필드를 추가하는 테이블을 변경했는지 확인하십시오. – sepehr

+0

저는 프로그래머가 아니며 코드가 작동 할 때까지 코드를 조작합니다. 그래서, 내 무지를 용서하지만 어디에 내가 게시물 테이블을 볼 수 있습니까? – CreativEliza

+1

방금 ​​WPML을 사용하면서 언어 별 카테고리를 사용할 수 있다는 질문에 대한 귀하의 의견을 읽었습니다. 따라서 위의 코드를 수행하는 가장 좋은 방법은 무엇입니까? 카테고리 슬러그를 일부 언어의 카테고리 슬러그로 대체하고 사이드 바에 배치하십시오. 그런데 cli, phpMyAdmin, Navicat Lite for MySQL 등을 사용하여 MySQL 테이블 구조를 볼 수 있습니다. http://bit.ly/3rAIx1 – sepehr