ฟอร์มการค้นหาขั้นสูงพร้อมตัวกรองสำหรับ taxonomies ที่กำหนดเองและฟิลด์ที่กำหนดเอง


30

ฉันต้องการสร้างฟอร์มการค้นหาขั้นสูงสำหรับประเภทโพสต์ที่กำหนดเองโดยเฉพาะมีตัวกรองสำหรับฟิลด์โพสต์ที่กำหนดเองประเภทกำหนดเอง taxonomies ที่กำหนดเองและสำหรับคุณสมบัติประเภทโพสต์ที่กำหนดเองแยกต่างหาก (เขตข้อมูลและ taxonomies) ประเภทโพสต์โดยใช้ฟิลด์ความสัมพันธ์ที่กำหนดเอง

ฉันเพิ่งเริ่มต้นด้วยประเภทโพสต์ที่กำหนดเอง WPs, เขตข้อมูลและ taxonomies ฉันรักมันจนถึงตอนนี้ แต่เพื่อให้ดีที่สุดของมันฉันต้องการที่จะสามารถค้นหาได้อย่างถูกต้อง ฉันต้องทำด้วยตนเองหรือไม่ ถ้าเป็นเช่นนั้นได้อย่างไร

PS ถ้ามันเป็นเรื่องสำคัญผมใช้ปลั๊กอิน: ฟิลด์ที่กำหนดเองขั้นสูงและกำหนดเองโพสต์ประเภท UI

ด้านล่างฉันล้อเลียนตัวอย่างของลักษณะการกรองและลักษณะที่อาจเกี่ยวข้องกับประเภทโพสต์ด้านบน

ฟอร์มการค้นหาที่กำหนดเอง wordpress กรองตามฟิลด์ที่กำหนดเองและ taxonomies


หากใครมีปัญหาในการใช้โซลูชันของเบรดี้ข้างต้น (อย่างที่ฉันทำ) นี่เป็นคำแนะนำ: ปรากฏว่า Wordpress มีปัญหาบางอย่างกับการส่งข้อมูลเซสชั่นดังนั้นคุณอาจต้องทำอะไรพิเศษเพื่อให้ทำงานได้อย่างถูกต้อง มีการกล่าวถึงปัญหาที่นี่: frank-verhoeven.com/using-session-in-wordpressสำหรับฉันการติดตั้งปลั๊กอิน "Simple Session Support" ของ Peter Wooster นั้นได้หลอกลวง มีลิงก์ไปยังปลั๊กอินในส่วนความคิดเห็นของโพสต์
SteveR

คำตอบ:


16

ฉันคิดว่าบางสิ่งเช่นนี้คุณควรเขียนตัวเองให้ดีที่สุด

ดูที่: http://www.catalysthomes.co.uk/homes-for-sale/

โหลดคุณสมบัติลงใน CPT และฉันมีการค้นหาที่กำหนดเองในแถบด้านข้าง จากการค้นหานั้นค้นหาสิ่งต่างๆเช่น taxonomies, ฟิลด์ที่กำหนดเองและการสั่งซื้อตามราคาวันที่เป็นต้น

ดังนั้นฉันจะบรรลุสิ่งนี้ได้อย่างไร ฉันส่งแบบฟอร์มไปยังเทมเพลตหน้าจากนั้นฉันจัดการกับข้อมูลโพสต์และสร้าง WP_query ใหม่ตามเกณฑ์การค้นหา ฉันใช้เซสชันเพื่อเก็บตัวแปรการค้นหาเพื่อให้สามารถแบ่งหน้าผลลัพธ์ได้

WP_Query มีประสิทธิภาพมาก ดู: http://codex.wordpress.org/Class_Reference/WP_Query

ในนั้นคุณสามารถใช้meta_queryในการสอบถามหลายฟิลด์ที่กำหนดเองและใช้tax_queryในการสอบถาม taxonomies ของคุณรวมทั้งมีมากขึ้น ด้านล่างคือวิธีการสร้างของฉันเพื่อให้แนวคิดแก่คุณ

ไฟล์เทมเพลต:

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

ผลดิบ

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

ผลการค้นหา

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

เค้าโครงรายการ เพียง WP WP มาตรฐานเพื่อแสดงข้อความที่ตัดตอนมาและข้อมูล


สวัสดี Brady ขอบคุณสำหรับตัวอย่างนี้ ฉันขอให้คุณแบ่งปันรูปแบบได้ไหมถ้าเป็นไปได้ ในนั้น URL ใดที่คุณส่งให้?
salocin

@salocin - ข้อมูลที่สามารถอากาศโดยการมองหาที่มาของหน้าเว็บที่ URL ที่กำหนดในคำตอบ
เบรดี้

ขอบคุณเบรดี้แล้วเทมเพลตของหน้าเว็บล่ะ
salocin

แบบฟอร์มอยู่บน catalysthomes.co.uk คุณสามารถดูแหล่งที่มาและดูว่าแบบฟอร์มทำงานอย่างไร
Brady

คุณตรวจสอบเพื่อดูว่า taxonomies ที่กำหนดเองมีการโพสต์ด้วยพวกเขาเป็นฟิลด์ที่กำหนดเองหรือไม่? คุณเติมข้อมูลในฟอร์มการค้นหาอย่างไร @Brady ขอบคุณ
Phil Hudson

2

ลองอนุกรมวิธาน Picker ปลั๊กอินกันกับ Relevanssi การรวมกันของนักฆ่า

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


สิ่งนี้ไม่ได้คำนึงถึงความสัมพันธ์ของการโพสต์ซึ่งเป็นส่วนที่ยากของปัญหาของฉัน เป็นวิธีที่ง่ายกว่าในการกรองโพสต์ตาม taxonomy ฉันต้องกรองพวกเขาซื้อ taxonomy (หรือฟิลด์ที่กำหนดเอง) ของโพสต์ที่เกี่ยวข้อง
สันติภาพ

0

ลองดูที่ส่วนปลั๊กอินที่มันอาจทำในสิ่งที่คุณกำลังมองหา: http://wordpress.org/extend/plugins/relevanssi/


ไม่เหมาะกับวิธีที่ฉันต้องการ (มีตัวกรองเฉพาะ) แต่มันเป็นปลั๊กอินที่น่าสนใจมากดูเหมือนว่าจะเป็นการแทนที่ที่ดีสำหรับฟังก์ชั่นการค้นหาเริ่มต้นขอบคุณมากสำหรับการชี้ให้เห็น
สันติภาพ

0

หากใครมีปัญหาในการใช้โซลูชันของเบรดี้ข้างต้น (อย่างที่ฉันทำ) นี่คือคำแนะนำ: ปรากฏว่า WordPress มีปัญหาบางอย่างกับการส่งผ่านข้อมูลเซสชั่นดังนั้นคุณอาจต้องทำอะไรพิเศษเพื่อให้ทำงานได้อย่างถูกต้อง ปัญหาที่กล่าวถึงที่นี่

ใน functions.php:

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

ในแม่แบบของคุณ:

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

สำหรับฉันแล้วการติดตั้งปลั๊กอิน" Simple Session Support " ของ Peter Wooster ทำเคล็ดลับได้แล้ว


1
สวัสดีสตีฟ ขอบคุณที่โพสต์คำตอบแรกของคุณที่นี่ ดีใจที่มีคุณที่ WPSE สำหรับการอ้างอิงในอนาคตคำตอบไม่ควร pivot อย่างสมบูรณ์ในลิงก์ภายนอก หากลิงก์ถูกปิดใช้งานคำตอบของคุณจะไม่เป็นอันตราย คุณต้องการอัปเดตคำตอบของคุณด้วยตัวอย่างข้อมูลโค้ดที่เกี่ยวข้องหรือไม่
Brian Fegter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.