web-dev-qa-db-fra.com

Comment afficher sur la page du blog les articles correspondant à la langue sélectionnée en utilisant Polylang

J'utilise Polylang (gratuit) pour internationaliser un site client. J'ai défini une langue par défaut (= FR), j'ai ajouté un sélecteur de langue dans ma barre de navigation (drapeaux FR et US) et paramétré les pages Avant et Blog pour les deux langues.

1) Le sélecteur de langue fonctionne bien avec les pages. Si vous allez à la page d'accueil ( http://cecile-chancerel-bijoux.com/wp/ ), vous avez la page d'accueil FR par défaut. Lorsque vous cliquez sur le drapeau américain, il vous redirige vers la page d'accueil des États-Unis.

2) C'est également vrai pour la page de blog (afficher la liste des articles). J'ai 2 URL différentes pour les blogs FR et US. Vous pouvez basculer entre eux avec les drapeaux de changement de langage:

FR: http://cecile-chancerel-bijoux.com/wp/blog/

US: http://cecile-chancerel-bijoux.com/wp/blog-fr/

Le problème est qu'ils affichent tous les deux les messages FR ET US. Évidemment, j'ai déjà défini la langue pour ces 2 messages. Vérifiez la capture d'écran ici: http://res.cloudinary.com/dbhsa0hgf/image/upload/v1522144114/blog_issue_with_polylang_x7ev8p.png

Je souhaite que le blog américain (/ blog-en) affiche uniquement les articles en anglais et le blog FR (/ blog) uniquement les articles en français. Comment puis-je atteindre cet objectif ?

EDIT:

J'utilise le thème Elegant de Themify, j'ai donc modifié ce fichier: wp-admin/wp_content/themes/themify-elegant/index.php comme ceci:

J'ai mis à jour le bloc suivant:

<?php// Loop?>
<?php if (have_posts()) : ?>
  <div id="loops-wrapper">
    <?php while (have_posts()) : the_post(); ?>
      <?php if(is_search()): ?>
       // some logic //
      <?php endif; ?>
    <?php endwhile; ?>
  </div>
<?php else : ?>
  <p><?php _e( 'Sorry, nothing found.', 'themify' ); ?></p>
<?php endif; ?>

avec une requête personnalisée

<?php// Loop?>
  <?php $args = array(
    'post_type'      => 'post',
    'lang'           => pll_current_language('slug'),
    'posts_per_page' => 10,
    'post_status'    => 'publish',
  );?>
  <?php $query = new WP_Query( $args );?>

  <?php if ($query->have_posts()) : ?>
    <div id="loops-wrapper">
      <?php while ($query->have_posts()) : $query->the_post(); ?>
        <?php if(is_search()): ?>
         // some logic //
        <?php endif; ?>
      <?php endwhile; ?>
    </div>
  <?php else : ?>
    <p><?php _e( 'Sorry, nothing found.', 'themify' ); ?></p>
  <?php endif; ?>

Et il fonctionne ! Finalement, seuls les articles en français sont affichés sur la page de mon blog français, comme pour l’anglais. Merci @Friss, c'est grâce à vous!

Guillaume

1
guillaume

vous pouvez ajouter le paramètre lang à vos arguments de boucle comme

$loop = new WP_Query( array (
        'post_type'      => 'post',
        'lang'           => pll_current_language('slug'), //returns 'en' for example    
        'posts_per_page' => 10,
        'post_status'    => 'publish',
) );

Cependant, ce n'est pas la meilleure pratique parce que, ce faisant, nous remplaçons la requête principale, qui n'est pas conviviale. Nous devrions mieux faire comme ceci en utilisant le hook d’action pre_get_post, donc dans votre fichier functions.php:

if(function_exists('pll_current_language')) // if polylang
{
    add_action( 'pre_get_posts', 'include_language' );
    function include_language( $query ) 
    {
        if ( $query->is_main_query() ) { //add more condition here if needed
            $query->set( 'lang', pll_current_language('slug') );
        }
    }   
}
2
Friss