Support » Plugin: Polylang » Polylang and Woocommerce

  • Hi!!

    I’m testing Polylang for my site.

    So far all works fine, except for one issue: My “cart” page does not show if I have Polylang activated. Without Polylang, it works well.

    Check out my site:
    www.
    deci
    belics
    .com
    (no spaces)

    Page /cart is well configured ( [woocommerce_cart] ) and as I said, with Polylang not activated it works well.

    But when I activate Polylang, when you click on “Your cart” it redirects you to “Page does not exist”

    Any thoughts on this? Need more info?

    Thanks!

    https://wordpress.org/plugins/polylang/

Viewing 8 replies - 1 through 8 (of 8 total)
  • Plugin Author Chouby

    (@chouby)

    Are you using the latest version of Polylang?

    Thread Starter Gui113m

    (@gui113m)

    Yes, I am using version 1.4.5

    Thanks

    Plugin Author Chouby

    (@chouby)

    It looks like a bug that should have been corrected in v1.4.5 (nothing related to woocommerc). At least I can’t reproduce it anymore with this version.

    Could you give details on Polylang settings and permalinks used?

    I guess there is no trailing slash in your permalinks settings. Could you add one?

    Thread Starter Gui113m

    (@gui113m)

    Sure!

    <?php
    /*
    Plugin Name: Polylang
    Plugin URI: http://polylang.wordpress.com/
    Version: 1.4.5
    Author: Frédéric Demarle
    Description: Adds multilingual capability to WordPress
    Text Domain: polylang
    Domain Path: /languages
    */

    /*
    * Copyright 2011-2014 Frédéric Demarle
    *
    * This program is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License as published by
    * the Free Software Foundation; either version 2 of the License, or
    * (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
    * MA 02110-1301, USA.
    *
    */

    define(‘POLYLANG_VERSION’, ‘1.4.5’);
    define(‘PLL_MIN_WP_VERSION’, ‘3.5’);

    define(‘POLYLANG_BASENAME’, plugin_basename(__FILE__)); // plugin name as known by WP

    define(‘POLYLANG_DIR’, dirname(__FILE__)); // our directory
    define(‘PLL_INC’, POLYLANG_DIR . ‘/include’);
    define(‘PLL_FRONT_INC’, POLYLANG_DIR . ‘/frontend’);
    define(‘PLL_ADMIN_INC’, POLYLANG_DIR . ‘/admin’);

    // default directory to store user data such as custom flags
    if (!defined(‘PLL_LOCAL_DIR’))
    define(‘PLL_LOCAL_DIR’, WP_CONTENT_DIR . ‘/polylang’);

    // includes local config file if exists
    if (file_exists(PLL_LOCAL_DIR . ‘/pll-config.php’))
    include_once(PLL_LOCAL_DIR . ‘/pll-config.php’);

    // our url. Don’t use WP_PLUGIN_URL http://wordpress.org/support/topic/ssl-doesnt-work-properly
    define(‘POLYLANG_URL’, plugins_url(‘/’ . basename(POLYLANG_DIR)));

    // default url to access user data such as custom flags
    if (!defined(‘PLL_LOCAL_URL’))
    define(‘PLL_LOCAL_URL’, content_url(‘/polylang’));

    // cookie name. no cookie will be used if set to false
    if (!defined(‘PLL_COOKIE’))
    define(‘PLL_COOKIE’, ‘pll_language’);

    // backward compatibility WP < 3.6
    // the search form js is no more needed in WP 3.6+ except if the search form is hardcoded elsewhere than in searchform.php
    if (!defined(‘PLL_SEARCH_FORM_JS’) && !version_compare($GLOBALS[‘wp_version’], ‘3.6’, ‘<‘))
    define(‘PLL_SEARCH_FORM_JS’, false);

    /*
    * controls the plugin, as well as activation, and deactivation
    *
    * @since 0.1
    */
    class Polylang {

    /*
    * constructor
    *
    * @since 0.1
    */
    public function __construct() {
    // manages plugin activation and deactivation
    register_activation_hook( __FILE__, array(&$this, ‘activate’));
    register_deactivation_hook( __FILE__, array(&$this, ‘deactivate’));

    // stopping here if we are going to deactivate the plugin (avoids breaking rewrite rules)
    if (isset($_GET[‘action’], $_GET[‘plugin’]) && ‘deactivate’ == $_GET[‘action’] && plugin_basename(__FILE__) == $_GET[‘plugin’])
    return;

    // avoid loading polylang admin for frontend ajax requests
    // special test for plupload which does not use jquery ajax and thus does not pass our ajax prefilter
    if (!defined(‘PLL_AJAX_ON_FRONT’))
    define(‘PLL_AJAX_ON_FRONT’, defined(‘DOING_AJAX’) && DOING_AJAX && empty($_REQUEST[‘pll_ajax_backend’]) && !(isset( $_REQUEST[‘action’] ) && ‘upload-attachment’ === $_REQUEST[‘action’]));

    if (!defined(‘PLL_ADMIN’))
    define(‘PLL_ADMIN’, defined(‘DOING_CRON’) || (is_admin() && !PLL_AJAX_ON_FRONT));

    if (!defined(‘PLL_SETTINGS’))
    define(‘PLL_SETTINGS’, is_admin() && isset($_GET[‘page’]) && $_GET[‘page’] == ‘mlang’);

    // blog creation on multisite
    add_action(‘wpmu_new_blog’, array(&$this, ‘wpmu_new_blog’));

    // FIXME maybe not available on every installations but widely used by WP plugins
    spl_autoload_register(array(&$this, ‘autoload’)); // autoload classes

    // override load text domain waiting for the language to be defined
    // here for plugins which load text domain as soon as loaded 🙁
    if (!defined(‘PLL_OLT’) || PLL_OLT)
    new PLL_OLT_Manager();

    // plugin initialization
    // take no action before all plugins are loaded
    add_action(‘plugins_loaded’, array(&$this, ‘init’), 1);

    // loads the API
    require_once(PLL_INC.’/api.php’);

    // WPML API
    if (!defined(‘PLL_WPML_COMPAT’) || PLL_WPML_COMPAT)
    require_once (PLL_INC.’/wpml-compat.php’);

    // extra code for compatibility with some plugins
    if (!defined(‘PLL_PLUGINS_COMPAT’) || PLL_PLUGINS_COMPAT)
    new PLL_Plugins_Compat();
    }

    /*
    * activation or deactivation for all blogs
    *
    * @since 1.2
    *
    * @param string $what either ‘activate’ or ‘deactivate’
    */
    protected function do_for_all_blogs($what) {
    // network
    if (is_multisite() && isset($_GET[‘networkwide’]) && ($_GET[‘networkwide’] == 1)) {
    global $wpdb;

    foreach ($wpdb->get_col(“SELECT blog_id FROM $wpdb->blogs”) as $blog_id) {
    switch_to_blog($blog_id);
    $what == ‘activate’ ? $this->_activate() : $this->_deactivate();
    }
    restore_current_blog();
    }

    // single blog
    else
    $what == ‘activate’ ? $this->_activate() : $this->_deactivate();
    }

    /*
    * plugin activation for multisite
    *
    * @since 0.1
    */
    public function activate() {
    global $wp_version;
    load_plugin_textdomain(‘polylang’, false, basename(POLYLANG_DIR).’/languages’); // plugin i18n

    if (version_compare($wp_version, PLL_MIN_WP_VERSION , ‘<‘))
    die (sprintf(‘<p style = “font-family: sans-serif; font-size: 12px; color: #333; margin: -5px”>%s</p>’,
    sprintf(__(‘You are using WordPress %s. Polylang requires at least WordPress %s.’, ‘polylang’),
    esc_html($wp_version),
    PLL_MIN_WP_VERSION
    )
    ));

    $this->do_for_all_blogs(‘activate’);
    }

    /*
    * plugin activation
    *
    * @since 0.5
    */
    protected function _activate() {
    global $polylang;

    if ($options = get_option(‘polylang’)) {
    // plugin upgrade
    if (version_compare($options[‘version’], POLYLANG_VERSION, ‘<‘)) {
    $upgrade = new PLL_Upgrade($options);
    $upgrade->upgrade_at_activation();
    }
    }
    // defines default values for options in case this is the first installation
    else {
    $options = array(
    ‘browser’ => 1, // default language for the front page is set by browser preference
    ‘rewrite’ => 1, // remove /language/ in permalinks (was the opposite before 0.7.2)
    ‘hide_default’ => 0, // do not remove URL language information for default language
    ‘force_lang’ => 0, // do not add URL language information when useless
    ‘redirect_lang’ => 0, // do not redirect the language page to the homepage
    ‘media_support’ => 1, // support languages and translation for media by default
    ‘sync’ => array(), // synchronisation is disabled by default (was the opposite before 1.2)
    ‘post_types’ => array_values(get_post_types(array(‘_builtin’ => false, ‘show_ui => true’))),
    ‘taxonomies’ => array_values(get_taxonomies(array(‘_builtin’ => false, ‘show_ui => true’))),
    ‘domains’ => array(),
    ‘version’ => POLYLANG_VERSION,
    );

    update_option(‘polylang’, $options);
    }

    // always provide a global $polylang object and add our rewrite rules if needed
    $polylang = new StdClass();
    $polylang->options = &$options;
    $polylang->model = new PLL_Admin_Model($options);
    $polylang->links_model = $this->get_links_model($polylang->model, $options);
    flush_rewrite_rules();
    }

    /*
    * plugin deactivation for multisite
    *
    * @since 0.1
    */
    public function deactivate() {
    $this->do_for_all_blogs(‘deactivate’);
    }

    /*
    * plugin deactivation
    *
    * @since 0.5
    */
    protected function _deactivate() {
    flush_rewrite_rules();
    }

    /*
    * blog creation on multisite (to set default options)
    *
    * @since 0.9.4
    *
    * @param int $blog_id
    */
    public function wpmu_new_blog($blog_id) {
    switch_to_blog($blog_id);
    $this->_activate();
    restore_current_blog();
    }

    /*
    * autoload classes
    *
    * @since 1.2
    *
    * @param string $class
    */
    public function autoload($class) {
    $class = str_replace(‘_’, ‘-‘, strtolower(substr($class, 4)));
    foreach (array(PLL_INC, PLL_FRONT_INC, PLL_ADMIN_INC) as $path)
    if (file_exists($file = “$path/$class.php”)) {
    require_once($file);
    break;
    }
    }

    /*
    * Polylang initialization
    * setups models and separate admin and frontend
    *
    * @since 1.2
    */
    public function init() {
    global $polylang;

    $options = get_option(‘polylang’);

    // plugin upgrade
    if ($options && version_compare($options[‘version’], POLYLANG_VERSION, ‘<‘)) {
    $upgrade = new PLL_Upgrade($options);
    if (!$upgrade->upgrade()) // if the version is too old
    return;
    }

    $model = PLL_SETTINGS ? new PLL_Admin_Model($options) : new PLL_Model($options);
    $links_model = $this->get_links_model($model);

    if (PLL_ADMIN) {
    $polylang = new PLL_Admin($links_model);
    $polylang->init();
    }
    // do nothing on frontend if no language is defined
    elseif ($model->get_languages_list()) {
    $polylang = new PLL_Frontend($links_model);
    $polylang->init();
    }
    else
    do_action(‘pll_no_language_defined’); // to load overriden textdomains

    // load wpml-config.xml
    if (!defined(‘PLL_WPML_COMPAT’) || PLL_WPML_COMPAT)
    new PLL_WPML_Config;
    }

    /*
    * setup the links model based on options
    *
    * @since 1.2
    *
    * @param object $model instance of PLL_Model
    * @return object implementing “links_model interface”
    */
    protected function get_links_model(&$model) {
    if (get_option(‘permalink_structure’)) {
    if (2 == $model->options[‘force_lang’])
    return new PLL_Links_Subdomain($model);
    elseif (3 == $model->options[‘force_lang’])
    return new PLL_Links_Domain($model);
    else
    return new PLL_Links_Directory($model);
    }
    return new PLL_Links_Default($model);
    }
    }

    new Polylang();

    Yes it looks like slash is missing on /cart, but when you hover cart button (right on the top) navigator shows clearly the right link, but when you click on it, it redirects to something like ***belics.comrrt instead of ***belics.com/cart

    Sorry I’m a noob, don’t know how to add trailing slash on my permalinks settings. Let me investigate how to do it and I will post it.

    Many many thanks!

    Plugin Author Chouby

    (@chouby)

    Yes I noticed that ‘ca’ is removed from your url. That’s why it reminds me a bug I believed solved.

    Why fo you give me the code of my plugin? I know it by heart 😉

    I meant the options you chose in Polylang settings page.
    For permalinks, go in options->permalinks look at what is written in the input field. Should be something like /%postname% . Do you confirm? Could you add a / at the end?

    Thread Starter Gui113m

    (@gui113m)

    Sorry for giving you the code!! Haha I’m freakin noob… sorry

    I FOUND IT!!! I changed permalinks, tried the /%postname% thing, reviewing settings… no changes, and then I removed Catalan language… and BAM! Cart now works fine!!!

    Maybe this is due to the similarities on /ca (catalan language) and /cart somewhere in the code or settings? Don’t know, but now it works… No matter if I can’t translate woocommerce into catalan, all of my catalan customers speaks spanish, so they can shop in this language.

    Thank you very much!

    Plugin Author Chouby

    (@chouby)

    Yes that’s the ‘ca’ of catalan language which interfers with the ‘ca’ of cart in an operation done by Polylang. That’s a bug that I could reproduced in the past, but now it works perfect on my test site.

    Could you try with /%postname%/ instead of /%postname% to see if it breaks the interference. That was the case in the past. Only users having no trailing slash in permalinks had this bug.

    Thread Starter Gui113m

    (@gui113m)

    Thanks I will try it this week and tell you what happens

Viewing 8 replies - 1 through 8 (of 8 total)
  • The topic ‘Polylang and Woocommerce’ is closed to new replies.