web-dev-qa-db-fra.com

Envoyer plusieurs valeurs de champs personnalisés via l'URL

Fondamentalement, j'essaie de suivre ce tutoriel d'ajouter une action au pre_get_posts et de créer une méta_query personnalisée afin de pouvoir modifier la requête dans l'URL et d'afficher les livres pour bébés, enfants et livres personnels de la manière suivante:

http://website.com/books/?type=babies,children,home

J'utilise le plug-in Champs personnalisés avancés pour mes champs personnalisés. Mon champ personnalisé s'appelle 'type' et est configuré dans WordPress comme un champ à cocher pour qu'il accepte plusieurs valeurs.

Pendant toute ma vie, je ne vois pas comment le faire pour afficher les messages interrogés.

function my_pre_get_posts( $query ) {
if( is_admin() ) { return; }

$meta_query = $query->get('meta_query');
    if( !empty($_GET['type']) ) {               
        $type = explode('|', $_GET['type']);    
        $meta_query[] = array(                          
            'key'       => 'type',
            'value'     => $type,
            'compare'   => 'IN',
        );
    }

$query->set('meta_query', $meta_query); // update the meta query args
return; // always return
}

Utiliser 'compare' => 'LIKE' renvoie simplement des publications aléatoires, utiliser IN renvoie une page de résultats vierge.

Je ne sais pas si cela a à voir avec mon paramètre $_GET['type'], qui est supposé être une chaîne.

Toute aide pour résoudre ceci est appréciée. Je suis sur ma 5ème tasse de café et la soirée ne s'annonce pas prometteuse.

archive.book.php

$args = array(
'post_type'     => 'book',
'posts_per_page'    => 10,
);

$wp_query = new WP_Query( $args );
while( $wp_query->have_posts() ) {

    $wp_query->the_post();
    get_template_part( 'content', get_post_format() );
}

Cette boucle normale:

<?php 
print_r( $wp_query->request );
if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        get_template_part( 'content', get_post_format() );
    } // end while
} // end if
?>

affiche ceci:

SELECT SQL_CALC_FOUND_ROWS blISt3rs871o_posts.ID FROM blISt3rs871o_posts WHERE 1=1 AND blISt3rs871o_posts.post_type = 'book' AND (blISt3rs871o_posts.post_status = 'publish' OR blISt3rs871o_posts.post_status = 'private') ORDER BY blISt3rs871o_posts.post_date DESC LIMIT 0, 10
2
realph

Tout d'abord, gardez à l'esprit que pre_get_posts est un hook exécuté sur chaque requête exécutée par WP. Soyez donc très prudent lorsque vous l'utilisez. Cela dit, c’est le meilleur outil pour ce que vous voulez faire, et certainement mieux que d’écrire une requête personnalisée distincte dans le modèle de page.

J'ai ajouté des conditions supplémentaires au début de cette fonction pour m'assurer qu'elle est abandonnée tôt si la requête est: pas pour la boucle principale, sur une page d'administrateur ou si la chaîne de requête 'type' n'est pas présente. Vous devez ajouter ici quelques conditions supplémentaires pour le restreindre davantage, par exemple. if ( ! is_page( 'something' ) ) { return; } ou if ( ! is_front_page() ) { return; }.

Cela dit, voici un exemple de code:

/**
 * Add custom meta filter to main query on any page.
 *
 * @since  1.0.0
 *
 * @param  object $query WP Query object.
 */
function wpse129223_custom_meta_query( $query ) {

    // If not on the main query, or on an admin page, bail here
    if ( ! $query->is_main_query() || is_admin() ) {
        return;
    }

    // If 'type' isn't being passed as a query string, bail here
    if ( empty( $_GET['type'] ) ) {
        return;
    }

    // Get the existing meta query, cast as array
    $meta_query = (array) $query->get('meta_query');

    // Convert 'type' into an array of types
    $types = explode( ',', $_GET['type'] );

    // Ensure that types aren't empty
    if ( is_array( $types ) && ! empty( $types ) ) {

        // Build a meta query for this type
        $meta_query[] = array(
            'key'     => 'type',
            'value'   => $types,
            'compare' => 'IN',
        );

        // Update the meta query
        $query->set( 'meta_query', $meta_query );
    } 

}
add_action( 'pre_get_posts', 'wpse129223_custom_meta_query' );

Ceci attend que la chaîne de requête soit séparée par des virgules, comme vous l'avez présenté dans votre exemple, website.com/wther/?type=one,two,three. Dans votre exemple de code, vous recherchiez un caractère de pipe, ce à quoi @ Foxsk8 parlait dans ses commentaires.

1
Brian Richards

Voici le code, ça marche.

<?php
     $type = explode(',', $_GET['type']);
     $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
     $myquery = new WP_Query(array(
     'post_type' => 'building',
     'meta_query'=>array(
            array(
                'key' => 'type',
                'value' => $type,
            ),

        )

    ));
    if ($myquery->have_posts()) :
    while ($myquery->have_posts()) : $myquery->the_post();
?>
<h1><?php the_title(); ?></h1>
<?php the_content(); ?>
<?php endwhile; endif; ?>
0
Foxsk8