web-dev-qa-db-ja.com

複数のタグを検索しますか?

だから私は次のように設定されているページテンプレートを持っている(Kleoテーマを使用して)

検索テンプレート

get_header(); ?>


<?php
//create right sidebar template
kleo_switch_layout('right');
?>

<?php get_template_part('page-parts/general-title-section'); ?>

<?php get_template_part('page-parts/general-before-wrap'); ?>

<?php
if ( have_posts() ) :
    // Start the Loop.
    while ( have_posts() ) : the_post(); ?>

<!-- Begin the Treeview menu -->
<form method="get" action="<?php bloginfo('url'); ?>">
    <div class="form-group">
        <input class="form-control" type="text" name="s" value="" placeholder="Search…" maxlength="50" required="required" />
    </div>
    <p>Refine search to posts containing chosen tags:</p>
<div class="acidjs-css3-treeview">
    <ul>
        <li><input type="checkbox" id="node-0" /><label><input type="checkbox" name="tag[]" value="node-0" /><span></span></label><label for="node-0">node-0</label>
            <ul>
                <li><input type="checkbox" id="node-0-0" /><label><input type="checkbox" name="tag[]" value="node-0-0" /><span></span></label><label for="node-0-0">node-0-0</label>
                    <ul>
                        <li><input type="checkbox" id="node-0-0-0" /><label><input type="checkbox" name="tag[]" value="node-0-0-0" /><span></span></label><label for="node-0-0-0">node-0-0-0</label></li>
                        <li><input type="checkbox" id="node-0-0-1" /><label><input type="checkbox" name="tag[]" value="node-0-0-1" /><span></span></label><label for="node-0-0-1">node-0-0-1</label></li>
                    </ul>
                </li>
            </ul>
        </li>
        <li><input type="checkbox" id="node-1" /><label><input type="checkbox" name="tag[]" value="node-1" /><span></span></label><label for="node-1">node-1</label>
            <ul>
                <li><input type="checkbox" id="node-1-0" /><label><input type="checkbox" name="tag[]" value="node-1-0" /><span></span></label><label for="node-1-0">node-1-0</label>
                    <ul>
                        <li><input type="checkbox" id="node-1-0-0" /><label><input type="checkbox" name="tag[]" value="node-1-0-0" /><span></span></label><label for="node-1-0-0">node-1-0-0</label></li>
                        <li><input type="checkbox" id="node-1-0-1" /><label><input type="checkbox" name="tag[]" value="node-1-0-1" /><span></span></label><label for="node-1-0-1">node-1-0-1</label></li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</div>
<!-- End the Treeview menu -->
<input class="btn btn-primary" type="submit" value="Submit" />
</form>

        <?php
        /*
         * Include the post format-specific template for the content. If you want to
         * use this in a child theme, then include a file called called content-___.php
         * (where ___ is the post format) and that will be used instead.
         */
        get_template_part( 'content', 'page' );
        ?>

        <?php get_template_part( 'page-parts/posts-social-share' ); ?>

        <?php if ( sq_option( 'page_comments', 0 ) == 1 ): ?>

            <!-- Begin Comments -->
            <?php comments_template( '', true ); ?>
            <!-- End Comments -->

        <?php endif; ?>

    <?php endwhile;

endif;
?>

<?php get_template_part('page-parts/general-after-wrap'); ?>

<?php get_footer(); ?>

問題

検索が正しく機能していません。そのようなクエリ文字列を返します。

URLは http://example.com/?s=searchterm&tag[]=key-Word1&tag[]=key-Word2 を表示します。

これにより、タグがフィルタリングされなくなります。

[]を編集してタグ検索を機能させることができますが、その場合はGET内の最後のタグ要素のみを検索することになり、目的が無効になります。

この質問で複数のタグを検索するためのこの特定のコードをここで実行するように鼓舞されました。 そのリンクはWP 4.4が出るまではうまくいかないことを示唆しているようです。現在のバージョンWPでこれを機能させる方法はありますか?

1
David Avellan

さて、私はそれが次のように私自身のparse phpを作ることによってうまくいったようにしました:

parse.php

<?php

$tags = $_POST['tag'];
$search = $_POST['s'];
$count = count($tags);

$i = 0;
if(!empty($search))
    $uri = "https://example.com/?s=$search&";
else
    $uri = "https://example.com/?tag=";
foreach($tags as $name=>$value) {
    ++$i;
    if($i !== $count)
        $uri .= $value."+";
    else
        $uri .= $value;
}

header("Location: $uri");
exit;
?>

そしてもちろん、元のフォームアクションをparse.phpを指すように変更し、メソッドをPOSTに変更します。

おそらくこれを行う最善の方法ではありませんが、現時点ではうまくいきます。誰かが私にもっと良い、あるいはもっときれいな答えをくれたら、してください。

1
David Avellan

私は同じ問題を抱えています。フックを通過した後(pre_get_postsは機能しません)、template_includeフックで$ SERVERをチェックすることにしました。 substr($ _ SERVER ['REQUEST_URI']、1)は解析可能なクエリ文字列です。私の設定では、かわいいURLではタグは+記号で区切られています。私がやるのはstr_replaceだけで '、'を付けてそれをあけて、新鮮なquery_post()に入れることです。

これは、少なくとも{domain}/cats + dogs + donkeysのようなURLで、URL内の+のインスタンスをすべて除外して新しいクエリを実行することで機能します。

0
kamiel verwer