0

所以我正在尝试制作一个简单的外部弹出窗口,其中有 1 个用于类别的下拉菜单和 4 列复选框作为标签。(这是为了提供一个 wordpress 搜索引擎插件)

我为此使用常规表单提交,但最终将其作为最终 URL:

Site.com/?category_name=VALUE&tag=TAG1&tag=TAG2&tag=TAG3

但我希望我的网址是这样的:

Site.com/?category_name=VALUE&tag=tag1+tag2+tag3

谁能指出我实现这一目标的正确方向?

CATEGORY_NAME用于搜索特定的 WordPress 类别,并且TAGS是常规的帖子标签。

4

2 回答 2

0

你不能用复选框来做到这一点。这不是复选框的工作方式。这不是一个选择,真的。它是构建 HTML、PHP 和您的浏览器的方式。

此外,您所做的将不起作用。您已将相同的变量设置为几个不同的字段。每次设置时,都会覆盖以前的值。?category_name=VALUE&tag=TAG1&tag=TAG2&tag=TAG3虽然如果您要添加到脚本中,您的 URL 可能看起来像,但var_dump($_GET);您会看到 PHP 看到的唯一内容是最后一个 - tag=TAG3

您可以通过[]在复选框名称中使用方括号 -- -- 来使代码正常工作。极简代码示例(仅用于演示目的):

echo '<form>';
 echo '<input type="checkbox" name="tag[]" value="tag1">';
 echo '<input type="checkbox" name="tag[]" value="tag2">';
 echo '<input type="checkbox" name="tag[]" value="tag3">';
 echo '<input type="checkbox" name="tag[]" value="tag4">';
 echo '<input type="checkbox" name="tag[]" value="tag5">';
 echo '<input type="checkbox" name="tag[]" value="tag6">';
 echo '<input type="submit" value="Clickie">';
echo '</form>';

但是,您的 URL 的“标签”部分将如下所示:

&tag[]=tag1&tag[]=tag4&tag[]=tag6

这就是复选框的工作方式。我能想到两种解决方法。

第一种是使用 Javascript 填充表单中的隐藏字段。

echo '<form>';
 echo '<input type="hidden" name="tag" value="">';
 echo '<input type="checkbox" value="tag1">';
 echo '<input type="checkbox" value="tag2">';
 echo '<input type="checkbox" value="tag3">';
 echo '<input type="checkbox" value="tag4">';
 echo '<input type="checkbox" value="tag5">';
 echo '<input type="checkbox" value="tag6">';
 echo '<input type="submit" value="Clickie">';
echo '</form>';

您将让您的 Javascript 监视对这些复选框的点击,并将值填充到隐藏标记字段中。为了获得您想要的 URL,您必须name从复选框中删除,这使得该表单完全依赖于 Javascript。如果没有 Javascript,它将无法工作。我认为这是糟糕的设计。

另一种选择是mod_rewrite尝试重写您的 URL,但老实说,我不知道是否mod_rewrite能够使用复杂的正则表达式来完成这项工作。

我不认为值得付出努力或付出代价的解决方法。我建议您使用方括号并在接收端处理数组。换句话说,如果你有,&tag[]=tag1&tag[]=tag4&tag[]=tag6那么这将得到一个字符串,就像你在你的 URL 中想要的那样:

if (isset($_GET['tag'])) {
  $tstr = implode('+',$_GET['tag']);
}
echo $tstr;

您可以在搜索功能中使用它,无论您使用什么。

于 2013-02-11T15:40:48.753 回答
0

这就是我所做的。我没有在我的 wordpress 中添加一个额外的功能(这在进行更深入的测试时会导致一些意外错误),我只是创建了一个 PHP 来在进一步提交之前捕获 URL。

这是它的样子:

    <?php

if (isset($_GET['tag'])) {
  $tstr = implode('+',$_GET['tag']);
}

$cat = ($_GET['category_name']);

header("Location: http://url.com/?category_name=$cat&tag=$tstr");

?> 


I don't know if this is correct or secure, but it works :D
Thanks for your help !
于 2013-02-12T09:16:50.037 回答