【问题标题】:How do I retain selected option in a select list with a for loop?如何在带有 for 循环的选择列表中保留选定的选项?
【发布时间】:2016-06-29 15:02:40
【问题描述】:

我使用 ACF Wordpress 插件创建了一个国家/地区列表。该插件允许创建自定义帖子元字段,因此每个帖子都有一个额外的元数据,即国家/地区名称。

我使用 WP_Query 获取国家/地区列表并将其存储在 $result 变量中:

$myquery = new WP_Query($myargs);
if ($myquery -> have_posts()) :
    while ($myquery -> have_posts()) : 
        $myquery -> the_post();
        array_push($arr, get_field('country'));
    endwhile;
endif;

wp_reset_postdata();
$result = array_unique($arr);

我现在需要的是选择一个国家,然后在搜索返回具有该国家元字段的帖子时保留它。 (右侧的蓝色按钮。)

我该怎么做?到目前为止,我已经尝试过:

<select name="countries" id="countries" class="form-control">
<?php 
for ($i = 0; $i < count($result); $i++) : 
    $selected = (isset($_POST['countries']) && $result[$i] == $_POST['countries']) ? 'selected' : ''; 
    $selected = ($result[$i] == @$_POST['countries']) ? 'selected' : ''; 
    echo '<option value="' . $result[$i] . '" ' . $selected . '>' . $result[$i] . '</option>'; 
endfor; 
?>
</select>

不会保留所选国家/地区。也不会

<?php 
    $selected = (isset($_GET['country']) && $result[$i] == $_GET['country']) ? 'selected="selected"': ''; 
?>

除此之外,我还需要添加“全部”值以允许选择所有国家/地区:&lt;option value="all"&gt;all&lt;/option&gt;。 “all”值也必须保留。

顺便说一句,有人可以在这里为我解释一下$_POST 的必要性吗?我认为此应用不需要&lt;form&gt;…&lt;/form&gt;

可以在http://elanonimo.dp.ua/找到该应用程序请忽略绿色下拉按钮。 (完整的WP主题源码在http://www.filedropper.com/package1467207510

【问题讨论】:

  • $selected = ($result[$i] 的行没有添加任何内容
  • 为了提高可读性,请考虑仅在 php 代码的开头使用 &lt;?php 并在末尾使用 ?&gt; 而不是每一行。
  • 为了提高可读性,考虑使用(正确的)缩进(循环内的前导空格)

标签: php wordpress for-loop


【解决方案1】:

array_unique($arr) 不会重新索引数组的键,因此for ($i = 0; $i &lt; count($result); $i++) 循环不起作用。你可以

$result = array_values(array_unique($arr));

foreach ($result as $country) {
    $selected = (isset($_GET['countries']) && $country == $_GET['countries']) ? ' selected' : ''; 
    echo '<option value="' . $country . '"' . $selected . '>' . $country . '</option>', "\n";
}

工作代码:http://phpfiddle.org/main/code/fuy5-6f3c

【讨论】:

  • 我将此标记为答案。感谢您的努力和时间。它确实增加了我的知识。
  • 只是注意到您将&lt;select&gt; 名称放在$_GET 上。我相信应该是变量名$selected = (isset($_GET['country']) &amp;&amp; $country == $_GET['country']) ? ' selected' : '';
  • 尝试将您的问题分成小部分并进行实验,然后再得出错误的结论,例如字段中未包含复选框。也许这可以激发HTTP://phpfiddle.org/main/code/smu7-rxf4
【解决方案2】:

添加“全部”值以允许选择所有国家:全部。 只需添加一个初始化语句:

$myquery = new WP_Query();
if ($myquery -> have_posts()) {
  $arr = ['All']; // statement added
  while ($myquery -> have_posts()) {

【讨论】:

    【解决方案3】:

    顺便说一句,有人可以在这里为我解释一下 $_POST 的需要吗?我认为此应用不需要&lt;form&gt;…&lt;/form&gt;

    $_POST['countries'] 如果服务器收到来自浏览器的 HTTP POST 请求,将在 php 中初始化。执行此操作的传统方法是使用带有您的国家/地区字段的form 和带有 method="post" 的提交按钮。但是,在您的页面中,输入按钮不在表单中,但它可以工作。这意味着某处有一些 javascript 将 click 事件处理程序(执行 get 请求)附加到 input

    但是,在您的页面中,没有&lt;form&gt;。某处有一个 javascript 将事件附加到输入按钮。它使用 POST,而不是 GET。它还发布了一个国家/地区,我们可以从http://elanonimo.dp.ua/?num=off&amp;country=%D0%98%D1%82%D0%B0%D0%BB%D0%B8%D1%8F&amp;price= url 看到。 如果你想在php中使用那个国家,你应该使用$_GET['country']

    如果$_GET['country'] 不起作用,则可能存在编码问题。尝试使用标准的 ASCII 国家/地区名称。

    【讨论】:

    • 确实有一段代码的 javascript 部分在点击蓝色按钮时起作用。当您右键单击页面并选择查看源代码时,将显示完整的代码。
    • if (selectedCountry != '') { location.href = 'http://elanonimo.dp.ua/?num=' + num + '&amp;country=' + selectedCountry + '&amp;price=' + a; } else { location.href = 'http://elanonimo.dp.ua/?country=all&amp;num=' + num + '&amp;price=' + a; }
    • 好的,这就是将 selectedCountry 转换为 URL 中的国家/地区的方式。 location.href 也执行 GET,因此请使用 $_GET['country']``,而不是 $_POST['countries']。您了解编码问题吗?你试过像Italy这样的ASCII国家而不是Италия吗?
    • 我明白你所说的可能的编码问题的意思。现在将尝试使用 ASCII 国家/地区名称。
    • Италия 更改为Italy 似乎没有帮助。我使用的代码有问题。 &lt;select name="countries" id="countries" class="form-control"&gt; &lt;?php for ($i = 0; $i &lt; count($result); $i++) : ?&gt; &lt;?php $selected = (isset($_GET['country']) &amp;&amp; $result[$i] == $_GET['country']) ? 'selected' : ''; ?&gt; &lt;?php echo '&lt;option value="' . $result[$i] . '" ' . $selected . '&gt;' . $result[$i] . '&lt;/option&gt;'; ?&gt; &lt;?php endfor; ?&gt; &lt;/select&gt; 抱歉无法正确格式化 cmets。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2017-10-17
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多