web-dev-qa-db-fra.com

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

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

J'ai récemment commencé avec les types d'articles, les champs et les taxonomies personnalisés de WP, j'adore ça, mais pour en tirer le meilleur parti, j'aimerais pouvoir le rechercher correctement. Dois-je le faire manuellement? Si c'est le cas, comment?

PS Si cela compte, j'utilise les plugins suivants: Champs personnalisés avancés et Interface utilisateur de type message personnalisée .

Ci-dessous, j'ai présenté un exemple de l'apparence du filtrage et de son lien possible avec les types de publication ci-dessus.

wordpress custom search form filtered by custom fields and custom taxonomies

30
pax

Je pense que quelque chose comme ça, tu ferais mieux de t'écrire.

Jetez un oeil à: 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 le classement par date, etc.

Alors, comment puis-je y arriver? Je soumets le formulaire à un modèle de page. À partir de là, je traite les données de publication et crée un nouveau WP_query basé 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 coup d'oeil: http://codex.wordpress.org/Class_Reference/WP_Query

Dans celui-ci, vous pouvez utiliser meta_query pour interroger plusieurs champs personnalisés et tax_query pour interroger vos taxonomies, et bien plus encore. Voici comment le mien est construit pour vous donner une idée.

Fichier de 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'
);
?>

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

16
Brady

Essayez le plugin Taxonomy Picker together avec Relevanssi. Combinaison de tueur.

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

2
Hexagon

Jetez un coup d'oeil au plugin Relevanssi, il pourrait faire ce que vous cherchez: http://wordpress.org/extend/plugins/relevanssi/ ​​

0
Jens Wedin

Si quelqu'un a du mal à mettre en œuvre la solution de Brady ci-dessus (comme je l'ai fait), voici un indice: il semble que WordPress rencontre des problèmes pour transmettre les données de session; vous devrez donc probablement ajouter un élément supplémentaire pour le faire fonctionner correctement. Les questions sont discutées 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 plug-in " Simple Session Support " de Peter Wooster a été efficace.

0
SteveR