web-dev-qa-db-fra.com

Rechercher plusieurs tags?

J'ai donc un modèle de page qui est configuré comme suit (avec le thème Kleo) :

Modèle de recherche

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(); ?>

Problème

La recherche ne fonctionne pas correctement. Il retourne une chaîne de requête en tant que telle:

L'URL indiquerait http://example.com/?s=searchterm&tag [] = key-Word1 & tag [] = key-Word2

Cela aurait pour conséquence que les balises ne seraient pas filtrées.

Je peux éditer le [] out pour que la recherche de balise fonctionne, mais je ne chercherais alors que le dernier élément de balise dans GET, ce qui irait à l'encontre du but recherché.

J'ai eu l'inspiration de faire ce code particulier pour la recherche de plusieurs balises sur cette question ici. Ce lien semble suggérer que cela ne fonctionnera pas jusqu'à ce que WP 4.4 arrive. Un moyen de faire fonctionner cela sous WP 4.3.1?

1
David Avellan

Eh bien, je l'ai fait fonctionner en faisant ma propre analyse php comme suit:

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;
?>

Et bien sûr, changer l'action de formulaire d'origine pour qu'elle pointe vers parse.php et la méthode pour POST.

Ce n’est probablement pas la meilleure façon de le faire, mais pour l’instant, cela fonctionne. Si quelqu'un peut me donner une réponse meilleure ou plus nette, veuillez le faire.

1
David Avellan

J'ai le même problème. Après être passé par les hooks (pre_get_posts ne fait pas le travail), j'ai décidé de vérifier que $ SERVER se trouvait dans le hook template_include. substr ($ _ SERVER ['REQUEST_URI'], 1) est la chaîne de requête que nous pouvons analyser. Dans ma configuration, les balises sont séparées par un signe + dans la jolie URL. Tout ce que je fais, c'est str_replace qui avec ',' et le nourrit, hélas, dans une nouvelle query_post ().

Cela fonctionne au moins avec une URL telle que {domaine}/cats + chiens + ânes en filtrant simplement toute instance de + dans l'URL et en effectuant une nouvelle requête.

0
kamiel verwer