Hiển thị kết quả tìm kiếm trong cùng một trang


7

Vấn đề

Tôi có một trang trên trang web của mình, nơi tôi cần thực hiện tìm kiếm bổ sung trong trang đó. Tôi đang sử dụng cách tìm kiếm mặc định của WordPress với tìm kiếm <?php get_search_form(); ?>tiêu đề chính của mình, hoạt động rất tốt.

Tôi đã tạo một biểu mẫu HTML khác trên trang của mình, không sử dụng phương thức PHP mặc định, để tìm kiếm bổ sung như vậy:

<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
    <div>
        <label for="s" class="screen-reader-text">Search for:</label>
        <input type="text" id="s" name="s" value="" />
        <input type="hidden" name="post_type" value="photo_group" /> 
        <input type="submit" value="Search" id="searchsubmit" />
    </div>
</form>

Tôi sử dụng type=hiddenđể nhận loại bài đăng tùy chỉnh mà tôi muốn tìm kiếm thông qua:

<input type="hidden" name="post_type" value="photo_group" />

cung cấp cho tôi một liên kết trông tương tự như:

http://mywebsite.com/?s=search&post_type=photo_group

Câu hỏi

Khi tôi sử dụng mẫu tìm kiếm mới được tạo trên trang, nó sẽ sử dụng search.php mặc định để hiển thị kết quả. Làm cách nào tôi có thể hiển thị kết quả tìm kiếm của tìm kiếm loại bài đăng tùy chỉnh, giả sử trong một trang divtrên cùng một trang?

Tôi đã thử tạo một mẫu trang mới sẽ hiển thị kết quả mà không thành công, đây có thể là cách làm đúng và tôi đã làm sai?

* Chỉnh sửa *

Tôi đang thử giải pháp của sanchothefat. Điều này có đúng không? Đây là toàn bộ div cho kết quả tìm kiếm và truy vấn tìm kiếm của tôi.

<div id="photo-search">
    <h2>Search Photos:</h2>
    <form action="<?php the_permalink(); ?>" id="searchform" method="get">
        <div>
            <label for="s" class="screen-reader-text">Search for:</label>
            <input type="text" id="search" name="search" value="" />
            <input type="hidden" name="post_type" value="photo_group" /> 
            <input type="submit" value="Search" id="searchsubmit" />
        </div>
    </form>

    <?php if( isset( $_REQUEST['search'] ) ) {
        query_posts( array(
        's' => $_REQUEST['search'],
        'post_type' => $_REQUEST['photo_group'],
        'paged' => $paged
        ));

        if( have_posts() ) : while ( have_posts() ) :
            the_title();
            the_content();                      
        endwhile; endif;

        wp_reset_query(); 
        }
    ?>
</div>

Tôi nhận được trang lỗi 404 không tìm thấy khi chạy qua tìm kiếm.


Giải pháp của tôi có làm việc cho bạn cuối cùng không?
sanchothefat

Bạn chỉ cho tôi đi đúng hướng, vì vậy, theo cách nó đã giúp tôi ra ngoài. Cảm ơn bạn rất nhiều.
Rô-ma

1
giải pháp của bạn là gì? Tôi đang cố gắng làm điều tương tự - hiển thị kết quả tìm kiếm của một bài đăng tùy chỉnh trong cùng trang với yêu cầu tìm kiếm và tôi tiếp tục nhận được một trang 404 khi tôi nhấp vào gửi
Claire

Câu trả lời:


4

Tùy chọn đơn giản nhất nếu bạn muốn hiển thị kết quả tìm kiếm trong ngữ cảnh trang, bạn sẽ cần thực hiện một vòng lặp tùy chỉnh, nếu không bạn sẽ không thể truy cập thông tin trang.

Thay đổi đầu vào với tên sthành một cái gì đó khác như searchhoặc qđể ngăn chặn wordpress làm như nó được xây dựng trong tìm kiếm thông thường.

Tiếp theo thay đổi actiontham số biểu mẫu thành URL của trang hiện tại. Bạn có thể sử dụng <?php get_permalink(); ?>cho điều đó.

Vòng lặp bạn cần làm như sau:

<?php
    if ( isset( $_REQUEST[ 'search' ] ) ) {
          // run search query
          query_posts( array(
             's' => $_REQUEST[ 'search' ],
             'post_type' => $_REQUEST[ 'post_type' ],
             'paged' => $paged
             )
          );

        // loop
        if ( have_posts() ) : while ( have_posts() ) :
            // loop through results here
        endwhile; endif;

        // return to original query
        wp_reset_query();
    }
?>

Tôi phải thay đổi if ( have_posts() ) : while ( have_posts() ) :để if ( have_posts() ) : while ( have_posts() ) : the_post();tránh vòng lặp vô hạn (không biết tại sao). Có lẽ bởi vì tôi đang kết xuất mẫu tùy chỉnh bên trong get_template_part(...).
jmarceli

2

Bạn có thể sửa đổi truy vấn trước khi nó được xử lý:

add_action('parse_query', function($query){

  // not the search request
  if(!$query->is_search)
    return;

  // validate post type here (you should provide a white-list)
  $post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : false;

  // adjust the query
  if($post_type && post_type_exists($post_type))
    $query->set('post_type', $post_type);

});

Điều này sẽ giúp bạn có được bài viết phù hợp với loại bài đăng được yêu cầu.

Nếu bạn muốn truy vấn nhiều loại bài đăng, chỉ cần truyền một mảng thay thế : array('post', 'page', $post_type). Và để nhóm các bài đăng dựa trên loại, kiểm tra loại trong vòng lặp và lưu trữ CPT của bạn trong một mảng tạm thời, mà bạn lặp lại sau khi các bài viết bình thường đã được hiển thị.


Đây có phải là một cái gì đó tôi đặt trong tệp tin.php của tôi hoặc chỉ đơn giản là trực tiếp trên trang?
Rô-ma

có, hoặc là hoặc xây dựng một plugin mới và dán mã vào nó
onetrickpony
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.