WordPress.org

Ready to get started?Download WordPress

Forums

Polylang
[resolved] pll_register_string problem (11 posts)

  1. jussi.r
    Member
    Posted 1 year ago #

    Hey,

    I'm using polylang 0.9.3 and I've made a simple plugin for a widget to make a list my posts of different post types (I use Types plugin too). You can set a title and a description text for the widget, but of course only widget's title is visible at "Strings translation" tab of Polylang settings.

    So I'm trying to use pll_register_string function. I use it at the "update" function what is called when you save the widget's settings. The problem is that the string doesn't come visible to the "Strings translation" list and I don't know why.

    Here is my plugin code (sorry, there is a lot of code you don't need to see):

    <?php
    /*
    Plugin Name: Post list
    Plugin URI:
    Description: Widget to list posts with specified post type
    Author: nnn
    Version: 1000
    Author URI:
    */
    
    class post_list extends WP_Widget
    {
      function post_list()
      {
        $widget_ops = array('classname' => 'post_list', 'description' => 'Post types: press-releases, media-tours, media-event' );
        $this->WP_Widget('post_list', 'Post list', $widget_ops);
      }
    
      function form($instance)
      {
        $instance = wp_parse_args( (array) $instance, array( 'title' => '','max_posts'=>2,'post_type'=>'post', "text"=>'' ) );
        $title = $instance['title'];
    	$max_posts = $instance['max_posts'];
    	$post_type = $instance['post_type'];
    	$text = $instance['text'];
    
    ?>
      <p><label for="<?php echo $this->get_field_id('title'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo attribute_escape($title); ?>" /></label>
      <p><label for="<?php echo $this->get_field_id('text'); ?>">Text: <input class="widefat" id="<?php echo $this->get_field_id('text'); ?>" name="<?php echo $this->get_field_name('text'); ?>" type="text" value="<?php echo attribute_escape($text); ?>" /></label>
      <p><label for="<?php echo $this->get_field_id('max_posts'); ?>">Max. posts: <input class="widefat" id="<?php echo $this->get_field_id('max_posts'); ?>" name="<?php echo $this->get_field_name('max_posts'); ?>" type="text" value="<?php echo attribute_escape($max_posts); ?>" /></label></p>
      <p><label for="<?php echo $this->get_field_id('post_type'); ?>">Post type: <input class="widefat" id="<?php echo $this->get_field_id('post_type'); ?>" name="<?php echo $this->get_field_name('post_type'); ?>" type="text" value="<?php echo attribute_escape($post_type); ?>" /></label></p>
    <?php
      }
    
      function makeEventDate($start,$end){
    
    	$start = strtotime($start,true);
    	$end = strtotime($end,true);
    
    	$startMonthYear = strtotime(date("Y-m",$start) . "-01",true);
    	$endMonthYear = strtotime(date("Y-m",$end) . "-01",true);
    
    	$startYear=date("Y",$start);
    	$endYear=date("Y",$end);
    
    	if($startYear<$endYear){
    		$startDate = date_i18n("F d, Y",$start);
    	}else{
    		$startDate = date_i18n("F d",$start);
    	}
    
    	if($endMonthYear>$startMonthYear){
    		$endDate = date_i18n("F d",$end);
    	}else{
    		$endDate = date("d",$end);
    	}
    
    	return $startDate . " - " . $endDate . ", " . $endYear;
    
    }
    
     function dateFormat($postID, $type){
    	$date="";
    
    	if($type == "media-tours"){
    		$date = $this->makeEventDate(get_post_meta($postID, 'start_date', true),get_post_meta($postID, 'end_date', true));
    	}else{
    		$date = get_post_meta($postID, 'date', true);
    		$date = strtotime($date,true);
    		$date = date_i18n("F d, Y",$date);
    	}
    
    	return $date;
    }
    
     function urlGet($postID, $type){
    	$URL="";
    
    	if($type=="media-follow-up"){
    		$URL=get_post_meta($postID, 'url', true);
    	}else{
    		$URL=get_permalink($postID);
    	}
    
    	return $URL;
     }
    
      function update($new_instance, $old_instance)
      {
        $instance = $old_instance;
        $instance['title'] = $new_instance['title'];
        $instance['max_posts'] = $new_instance['max_posts'];
        $instance['post_type'] = $new_instance['post_type'];
        $instance['text'] = $new_instance['text'];
    
        pll_register_string("Post list text",$instance['text'] );
    
        return $instance;
      }
    
      function widget($args, $instance)
      {
        extract($args, EXTR_SKIP);
    
        echo $before_widget;
    
        $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']);
    	$max_posts = $instance['max_posts'];
    	$post_type = $instance['post_type'];
    	$text = $instance['text'];
    
    	echo '<div class="post_list ' . $post_type . '">'
    	. '<div class="' . $post_type . '_icon icon"></div>'
    	. '<div class="description">'
    	. $before_title . $title . $after_title
    	. '<i>'
    	. pll__($text)
    	. '</i></div><div class="posts">';
    
    	$args = array( 'post_type' => $post_type, 'numberposts'=>$max_posts );
    	$recent_posts = wp_get_recent_posts( $args );
    	foreach( $recent_posts as $recent ){
    	$post = get_post( $recent["ID"] );
    
    	echo '<span class="date">' .  $this->dateFormat($recent["ID"],$post_type) . "</span><br>"
    		. '<a href="' . $this->urlGet($recent["ID"],$post_type) . '">' .   $recent["post_title"].'</a><br>';
    
    	}
    
    	echo "</div></div>";
        echo $after_widget;
      }
    
    }
    add_action( 'widgets_init', create_function('', 'return register_widget("post_list");') );?>

    I understand the string should come visible to "Strings translation" tab when I save plugins settings.

    http://wordpress.org/extend/plugins/polylang/

  2. jussi.r
    Member
    Posted 1 year ago #

    So I'm trying to make it possible to translate that $text too.

  3. Chouby
    Member
    Plugin Author

    Posted 1 year ago #

    In fact, the function pll_register_string has some effect only on the strings translation page and your update function is not called on this page (it should be called only when you update the widget settings)

    I would try to add something like this to your constructor (which is called on all pages):

    global $polylang;
    if (isset($polylang)) {
      $settings = $this->get_settings();
      pll_register_string("Post list text", $settings['text']);
    }
  4. jussi.r
    Member
    Posted 1 year ago #

    I thought it saves the string to a database or something.

    I have three of those widgets and every one of them has different setting for $text. Hmmm.. How does the widget title go to "Strings translation"?

  5. jussi.r
    Member
    Posted 1 year ago #

    Could this be used for this purpose somehow?
    http://adambrown.info/p/wp_hooks/hook/widget_text

    EDIT: I solved my problem by adding these lines to polylang admin.php

    if (isset($widget_settings[$number]['text']) && $title = $widget_settings[$number]['text'])
    					$this->register_string(__('Widget text', 'polylang'), $title);
  6. v4ssi
    Member
    Posted 10 months ago #

    Sorry for necroposting.
    How is possible get the last solution without change the admin.php ?
    I tried to understand how do it with hooks/override on functions.php but i'm not getting any point.

  7. Chouby
    Member
    Plugin Author

    Posted 10 months ago #

    Could you better explain what you want to achieve?

  8. v4ssi
    Member
    Posted 10 months ago #

    Hello Chouby, thank you for you attention.

    I need to have the possibility to modify the "widget-text content" from strings-translations of your awesome plugin.
    And the code that jussi.r wrote it's good but force me to change the function directly into the plugin files, that i don't want do.

    I tried to achieve this result using hooks/override but today i'm really stunned and i don't arrive to my objective.

    And i don't want use forking/svn too.

    Thank you.

    p.s.
    Sry for my english.

  9. Chouby
    Member
    Plugin Author

    Posted 10 months ago #

    The best in my opinion is to use the possibility to have a widget displayed for only one language (Polylang adds this option in most widgets including the text widget).

    Otherwise you can add use this code in a custom plugin or in functions.php

    add_filters('pll_get_strings', 'add_widget_text');
    
    function add_widget_text($strings) {
    	global $wp_registered_widgets;
    	$sidebars = wp_get_sidebars_widgets();
    	foreach ($sidebars as $sidebar => $widgets) {
    		if ($sidebar == 'wp_inactive_widgets' || !isset($widgets))
    			continue;
    
    		foreach ($widgets as $widget) {
    			if (!isset($wp_registered_widgets[$widget]['callback'][0]) || !is_object($wp_registered_widgets[$widget]['callback'][0]) || !method_exists($wp_registered_widgets[$widget]['callback'][0], 'get_settings'))
    				continue;
    
    			$widget_settings = $wp_registered_widgets[$widget]['callback'][0]->get_settings();
    			$number = $wp_registered_widgets[$widget]['params'][0]['number'];
    
    			if (isset($widget_settings[$number]['text']) && $text = $widget_settings[$number]['text'])
    				$strings[] = array('widget text', $text, 'Widget', true);
    		}
    	}
    	return $strings;
    }

    That's not tested

  10. v4ssi
    Member
    Posted 10 months ago #

    I was not far when i tried alone but not enough near. :D
    I tried to debug the code for 3 hours, like a dumb, because the server gave to me "internal server error 500 ".
    Also if loggin was active, wordpress and server too weren't new log.

    Anyway i found the problem and fixed it. Thanks you so much Chouby. ^^

    add_filter('pll_get_strings', 'add_widget_text');
    function add_widget_text($strings) {
    	global $wp_registered_widgets;
    	$sidebars = wp_get_sidebars_widgets();
    
    	foreach ($sidebars as $sidebar => $widgets) {
    		if ($sidebar == 'wp_inactive_widgets' || !isset($widgets))
    			continue;
    
    		foreach ($widgets as $widget) {
    			if (!isset($wp_registered_widgets[$widget]['callback'][0]) || !is_object($wp_registered_widgets[$widget]['callback'][0]) || !method_exists($wp_registered_widgets[$widget]['callback'][0], 'get_settings'))
    				continue;
    
    			$widget_settings = $wp_registered_widgets[$widget]['callback'][0]->get_settings();
    			$number = $wp_registered_widgets[$widget]['params'][0]['number'];
    
    			if (isset($widget_settings[$number]['text']) && $text = $widget_settings[$number]['text'])
    				$strings[] = array('name' => 'Widget text', 'string' => $text, 'context' => 'Widget', 'multiline' => true);
    		}
    	}
    	return $strings;
    }

    add_filter instead of add_filters
    And i added the names to the array keys.

    They are added at the end of the pages but whocares. ^^

    Update:
    If i edit the text the query works but in the frontend the widget remain with the "default" language.
    I think that the problem is the widget option "The widget is displayed for: All languages" that if turned ON override the visualization of the translation and if it's turned OFF hide the widget for the other language.

  11. v4ssi
    Member
    Posted 10 months ago #

    I've found the solution of the second problem.
    Just add in functions.php this line:

    add_filter('widget_text', 'pll__', 1);

    That i've taken from core.php line 117.

    Thank you again Chouby.

Topic Closed

This topic has been closed to new replies.

About this Plugin

About this Topic

Tags