【问题标题】:PHP multilingual site displaying array in correct order with Qtranslate使用 Qtranslate 以正确顺序显示数组的 PHP 多语言站点
【发布时间】:2025-12-01 15:10:02
【问题描述】:

我正在使用 qtranslate 运行一个 wordpress 博客。它使用 3 种语言。

我创建了一个自定义菜单(价目表),它使用 post_meta wp 挂钩保存到 db。

我使用简单的逻辑来显示列表项,当我只使用一种语言时它工作得很好。但是现在我添加了 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;
        ?>

$pricelistline 的 print_r 是:

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( "&lt;li&gt;&lt;p&gt;" . $e[0] . " &lt;span&gt;" . $e[1] . "&lt;/span&gt;&lt;/p&gt; &lt;span class=\"listmenuprice\"&gt;" . $e[2] . "&lt;/span&gt;&lt;div class=\"clearfloat\"&gt;&lt;/div&gt;&lt;!-- Very Important --&gt;&lt;/li&gt;\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>

注意:&lt;li&gt;&lt;p&gt;&lt;li&gt;&lt;p&gt; 这是剩下的两种语言的两个开始元素。我的猜测是 $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" }

【问题讨论】:

    标签: php wordpress multilingual qtranslate


    【解决方案1】:

    我不知道 _e 是如何屏蔽其他语言的,但是当它找到错误语言的单词时,它看起来就像是会掉线,我建议您执行以下操作之一:

    变体 1:不使用 foreach,而是根据语言为数组使用固定索引

    变体 2:自己检查数组的第一个字母,看它是否匹配正确的语言,如果是,则改用旧的 echo。

    变体 3:找到一个函数,该函数仅告诉您该语言是否是您正在寻找的语言,并根据该条件回显输出

    更新:看起来 Variant3 的函数可能是 __(我认为这是两个下划线)

    【讨论】:

    • 我可以用这个函数检查它: if( qtrans_getLanguage() == 'en' ){} 但我很难理解如何将它与我的代码集成,或者使用什么逻辑.
    • 如果无论语言如何,语言都使用相同的索引存储,您可以删除 foreach 并将 $e 的定义修改为 $e = explode("|", $pricelist[index_for_current_language]); 否则在其中使用 foreach 和 if 和 if原来的回声
    • 如果我采用 $pricelistline 数组并在它到达 foreach 之前将其过滤掉会怎样。使用 if 函数 (if == en) 删除所有其他条目,但以 [:en] 开头的条目除外。所以这是我理解的变体 2
    • 那将是 if(substring($value, 2, 2) == qtrans_getLanguage()) { ... the content of the original foreach here ... } 抱歉,但我不知道如何创建多行 cmets
    • 我不明白这其中的逻辑。而且它不起作用... p.s.您可以编辑原始答案。