PHP многоязычный сайт отображает массив в правильном порядке с Qtranslate

Я веду WordPress блог с qtranslate. Он использует 3 языка.

Я создал собственное меню (прайс-листы), которое сохраняется в БД с помощью wp-хуков post_meta.

Я использую простую логику для отображения элемента списка, он отлично работал, когда я использовал только один язык. Но теперь, когда я добавил qtranslate, у меня проблемы.

Позвольте мне провести вас через процесс разрешения, чтобы вы лучше поняли, где я застрял!

Итак, у меня был этот код:

        <?php
            if ( get_post_meta($post->ID, 'price_list_items_category1', true) ) :
                $pricelistline = explode("\n", get_post_meta($post->ID, 'price_list_items_category2', true));

                foreach($pricelistline as $value) {
                    $e = explode("|",$value);
                    echo "<li><p>" . $e[0] . " <span>" . $e[1] . "</span></p> <span class=\"listmenuprice\">" . $e[2] . "</span><div class=\"clearfloat\"></div><!-- Very Important --></li>\n";
                }
            endif;
        ?>

print_r для $ pricelistline был:

Array ( [0] => [:en]Rhine Riesling1|0,75 l|9,50 € [1] => [:ge]ჩიხირთმა|100გ|10ლ [2] => [:ru]шоколад|100грамм|10 L )

Очевидно, мой сценарий отображал все три языка одновременно... Чтобы исправить это, я прочитал о qtranslate и обнаружил, что при использовании _e() qtranslate перенесет ситуацию и отобразит правильный язык и заблокирует нежелательные.

Итак, модифицированный код:

        <?php
            if ( get_post_meta($post->ID, 'price_list_items_category1', true) ) :
                $pricelistline = explode("\n", get_post_meta($post->ID, 'price_list_items_category1', true));

                print_r($pricelistline);
                foreach($pricelistline as $value) {
                    $e = explode("|",$value);
                    _e( "<li><p>" . $e[0] . " <span>" . $e[1] . "</span></p> <span class=\"listmenuprice\">" . $e[2] . "</span><div class=\"clearfloat\"></div><!-- Very Important --></li>\n");
                }
            endif;
        ?>

Обратите внимание на разницу здесь: _e( "<li><p>" . $e[0] . " <span>" . $e[1] . "</span></p> <span class=\"listmenuprice\">" . $e[2] . "</span><div class=\"clearfloat\"></div><!-- Very Important --></li>\n");

Казалось, это сработало! как исчезли другие языковые экземпляры, так что на английской странице я видел бы только английскую версию и т. д.

Проблема в том, что теперь я нахожу некоторые поддельные HTML, оставшиеся при просмотре исходного кода.

Вывод HTML теперь выглядит так:

<ul class="listmenuitems" id="listingmenu_1">
<li><p>Rhine Riesling1 <span>0,75 l</span></p> <span class="listmenuprice">9,50 €
</span><div class="clearfloat"></div><!-- Very Important --></li>
<li><p><li><p>
</ul>

обратите внимание: <li><p><li><p> это два вводных элемента двух оставшихся языков. Я предполагаю, что что-то застряло в $e[1] на языках, которые не отображаются, и именно поэтому языки, кажется, работают! но на самом деле есть некоторая ошибка php.

я сделал tail -f /var/log/apache2/error_log но я не вижу никаких ошибок php.

и так, что здесь происходит? не могли бы вы помочь? Мне просто нужно избавиться от лишних элементов HTML. В остальном моя модификация, похоже, сработала!

Вышел как длинный пост, но я надеюсь, что я дал все детали.

Спасибо за прочтение:)

var_dump

array(3) { [0]=> string(37) "[:en]Rhine Riesling1|0,75 l|9,50 € " [1]=> string(43) "[:ge]ჩიხირთმა|100გ|10ლ " [2]=> string(38) "[:ru]шоколад|100грамм|10 L" }

1 ответ

Решение

Я не знаю, как _e блокирует другие языки, но похоже, что он просто падает, когда находит слово на неправильном языке, я предлагаю вам сделать одно из:

Вариант 1: не используйте foreach, а вместо этого используйте фиксированные индексы для вашего массива в зависимости от языка

Вариант 2: проверьте первые буквы массива самостоятельно, чтобы увидеть, соответствует ли он правильному языку, и если да, используйте вместо него старое эхо.

Вариант 3: найдите функцию, которая просто сообщает вам, является ли язык тем, который вы ищете, и выведите результат в зависимости от этого условия

Обновление: похоже, что функция для Variant 3 может быть __ (это два подчеркивания, я думаю)

Другие вопросы по тегам