Formulaire de recherche avancée avec filtres pour les taxonomies personnalisées et les champs personnalisés

30

Je voudrais créer un formulaire de recherche avancée pour un type de publication personnalisé spécifique, ayant des filtres pour les champs personnalisés des types de publication personnalisés, des taxonomies personnalisées et pour des propriétés de types de publication personnalisées distinctes (champs et taxonomies) qui seront des liens vers le premier type de publication à l'aide d'un champ de relation personnalisé.

J'ai récemment commencé avec les types de messages personnalisés, les champs et les taxonomies de WP, je l'aime jusqu'à présent, mais pour en tirer le meilleur, j'aimerais pouvoir le rechercher correctement. Dois-je le faire manuellement? Si c'est le cas, comment?

PS Si cela est important, j'utilise les plugins: champs personnalisés avancés et interface utilisateur de type de publication personnalisé .

Ci-dessous, j'ai simulé un exemple de l'apparence du filtrage et de sa relation avec les types de publication ci-dessus.

formulaire de recherche personnalisé wordpress filtré par champs personnalisés et taxonomies personnalisées

pax
la source
Si quelqu'un a du mal à implémenter la solution de Brady ci-dessus (comme je l'ai fait), voici un indice: il semble que Wordpress ait des problèmes avec la transmission des données de session, vous devrez donc probablement faire quelque chose de plus pour le faire fonctionner correctement. Les problèmes sont discutés ici: frank-verhoeven.com/using-session-in-wordpress Pour moi, l'installation du plugin "Simple Session Support" de Peter Wooster a fait l'affaire. Il y a un lien vers le plugin dans la section commentaires de l'article.
SteveR

Réponses:

16

Je pense que quelque chose comme ça, vous feriez mieux de vous écrire.

Jetez un œil à: http://www.catalysthomes.co.uk/homes-for-sale/

Les propriétés sont chargées dans un CPT et j'ai ma propre recherche personnalisée dans la barre latérale. De cette recherche, il recherche un certain nombre de choses telles que les taxonomies, les champs personnalisés et la commande par date, etc.

Alors, comment puis-je y parvenir? Je soumets le formulaire à un modèle de page et à partir de là, je traite les données de publication et crée une nouvelle WP_query basée sur les critères de recherche. J'utilise des sessions pour stocker les variables de recherche afin de pouvoir paginer les résultats.

WP_Query est très puissant. Jetez un œil: http://codex.wordpress.org/Class_Reference/WP_Query

Là, vous pouvez utiliser meta_querypour interroger plusieurs champs personnalisés et utiliser tax_querypour interroger vos taxonomies, et il y en a plus. Voici comment le mien est construit pour vous donner une idée.

Fichier modèle:

  <?php
  $temp = $wp_query;
  $wp_query = NULL;
  $args = array();
  ?>

  <?php include("functions/Homes-for-sale/propertyrawresults.php"); ?>
  <?php include("functions/Homes-for-sale/propertysearchresults.php"); ?>

  <?php
  $args['post_type'] = "homes-for-sale";
  $args['showposts'] = 10;
  $args['paged'] = $paged;
  $wp_query = new WP_Query($args);
  ?>

  <?php include("functions/Homes-for-sale/propertylistlayout.php"); ?>

Résultats bruts

<?php
if($_POST['sortby']) {
    $_SESSION['prop_selectedsortby'] = $_POST['sortby'];
}

switch($_SESSION['prop_selectedsortby']) {
    case "name-asc": $args['order'] = "ASC"; $args['orderby'] = "title"; break;
    case "name-desc": $args['orderby'] = "title"; break;
    case "price-asc": $args['order'] = "ASC"; $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
    case "price-desc": $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
    case "date-asc": $args['order'] = "ASC"; break;
    default: /* No need to set arguments here as wp query defaults */ break;
}

$selectedsortby[$_SESSION['prop_selectedsortby']] = " selected=\"selected\"";
?>

Résultats de la recherche

<?php
if( ! empty( $_SESSION['s_property_ptype'] ) ) {
    $args['meta_query'][] = array(
        'key' => 'chb_homes_for_sale_types_nbrs',
        'value' => $_SESSION['s_property_ptype']
    );
}

if( ! empty( $_SESSION['s_property_development'] ) ) {
    $args['meta_query'][] = array(
        'key' => 'chb_homes_for_sale_ofdevelopment',
        'value' => $_SESSION['s_property_development']
    );
}

if( isset( $_SESSION['s_property_area'] ) && 0 != $_SESSION['s_property_area'] ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'areas',
        'field' => 'id',
        'terms' => array( (int) $_SESSION['s_property_area'] ),
    );
}

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bedrooms',
    'value' => $_SESSION['s_property_bedrooms_min'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bedrooms',
    'value' => $_SESSION['s_property_bedrooms_max'],
    'compare' => '<=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bathrooms',
    'value' => $_SESSION['s_property_bathrooms_min'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bathrooms',
    'value' => $_SESSION['s_property_bathrooms_max'],
    'compare' => '<=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_fmv',
    'value' => $_SESSION['s_property_min_price'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_fmv',
    'value' => $_SESSION['s_property_max_price'],
    'compare' => '<=',
    'type' => 'SIGNED'
);
?>

Disposition de la liste Juste une boucle WP standard pour afficher des extraits de messages et des informations.

Brady
la source
Salut Brady, Thx pour cet exemple. Puis-je vous demander, si possible, de partager le formulaire? Dans ce document, à quelle URL le soumettez-vous?
salocin
@salocin - Cette information peut être obtenue en regardant la source de la page sur l'URL donnée en réponse
Brady
thx Brady, donc l'url du modèle de page?
salocin
Le formulaire est sur catalyseurhomes.co.uk. Vous pouvez voir la source et voir comment le formulaire fonctionne
Brady
Êtes-vous en train de vérifier si les taxonomies personnalisées ont des publications avec elles en tant que champ personnalisé? Comment remplissez-vous exactement le formulaire de recherche? @Brady thanks
Phil Hudson
2

Essayez le plugin Taxonomie Picker ensemble avec Relevanssi. Combinaison tueur.

http://www.squidoo.com/taxonomy-picker-wordpress-plugin http://wordpress.org/extend/plugins/relevanssi/

Hexagone
la source
cela ne prend pas en compte les relations de poste, cela étant la partie difficile de mon problème. Il est beaucoup plus facile de filtrer les messages par taxonomie, j'ai besoin de les filtrer pour acheter la taxonomie (ou le champ personnalisé) d'un message connexe.
pax
0

Jetez un œil au plugin Relevanssi, il pourrait faire ce que vous cherchez: http://wordpress.org/extend/plugins/relevanssi/

Jens Wedin
la source
Il ne convient pas à l'approche dont j'ai besoin (avec des filtres spécifiques), mais c'est un plugin très intéressant, il ressemble à un excellent remplacement de la fonction de recherche par défaut, merci beaucoup de l'avoir signalé.
pax
0

Si quelqu'un a du mal à implémenter la solution de Brady ci-dessus (comme je l'ai fait), voici un indice: il semble que WordPress ait des problèmes avec la transmission des données de session, vous devrez donc probablement faire quelque chose de plus pour le faire fonctionner correctement. Les problèmes sont discutés ici

Dans functions.php:

function init_sessions() {
  if (!session_id()) {
  session_start();
 }
}
add_action('init', 'init_sessions');

Dans votre modèle:

/**
* Enable sessions
*/
if (!session_id())
session_start();

Pour moi, l'installation du plugin " Simple Session Support " de Peter Wooster a fait l'affaire.

SteveR
la source
1
Salut Steve. Merci d'avoir posté votre première réponse ici. Heureux de vous avoir au WPSE. Pour référence future, les réponses ne devraient pas pivoter complètement sur un lien externe. Si le lien est désactivé, votre réponse devient bénigne. Pourriez-vous mettre à jour votre réponse avec quelques exemples d'extraits de code pertinents?
Brian Fegter