Wordpress Пользовательский поиск по post_type - PullRequest
0 голосов
/ 18 ноября 2011

Я испробовал несколько методов, но я не могу отфильтровать пользовательские post_types из результатов поиска и надеялся, что кто-то может помочь.

Я установил «Диспетчер заданий» и создал 4 задания, которые имеют пользовательский post_type = 'jobman_job'

Я попытался создать форму ручного поиска и установить скрытое значение post_type = jobman_job, но он все равно вернул все сообщения.

<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ); ?>">
<input type="text" name="s" id="s" value=""/>
<input type="hidden" name="post_type" value="jobman_job" />
<input type="submit" id="searchsubmit" value="Search" />
</form>

Затем я попытался создать пользовательскую страницу поиска и перенаправить поиск на эту страницу следующим образом (т.е. добавил page_id скрытое поле):

<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ); ?>">
<input type="text" name="s" id="s" value=""/>
<input type="hidden" name="page_id" value="123" />
<input type="hidden" name="post_type" value="jobman_job" />
<input type="submit" id="searchsubmit" value="Search" />
</form>

А затем на странице пользовательского поиска я добавил следующий код (согласно руководству по wordpress - http://codex.wordpress.org/Creating_a_Search_Page) и добавил post_type из jobman_job в массив запросов:

global $query_string;

$query_args = explode("&", $query_string);
$search_query = array('post_type' => 'jobman_job');

foreach($query_args as $key => $string) {
    $query_split = explode("=", $string);
    $search_query[$query_split[0]] = urldecode($query_split[1]);
} // foreach

$search = new WP_Query($search_query);

И все равно отображаются все сообщения ...

Что я делаю не так? Я проверил столбец post_type в таблице wp_posts и у меня есть 4 уникальные записи ... поэтому они есть ...

Есть ли понимание?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2011

Я просто оставил HTML как есть:

<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ); ?>">
  <input type="text" name="s" id="s" value=""/>
  <input type="hidden" name="post_type" value="jobman_job" />
  <input type="submit" id="searchsubmit" value="Search" />
</form>

и добавил следующее в мои functions.php

function mySearchFilter($query) {

    if (isset($_GET['post_type']) && $_GET['post_type'] == 'jobman_job') {
        $post_type = 'jobman_job';
    } else {
        $post_type = 'any';
    }
    if ($query->is_search) {
            $query->set('post_type', $post_type);
    };
    return $query;
};

add_filter('pre_get_posts','mySearchFilter');
0 голосов
/ 18 ноября 2011

Как объясняет Кодекс, после получения новых данных вам необходимо заменить цикл новыми данными, как в этом примере

<?php if ($pageposts): ?>
<?php global $post; ?>
<?php foreach ($pageposts as $post): ?>
 <?php setup_postdata($post); ?>

 <div class="post" id="post-<?php the_ID(); ?>">
 <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
<?php the_title(); ?></a></h2>
<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
<div class="entry">
   <?php the_content('Read the rest of this entry »'); ?>
</div>
<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  
<?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
 </div>
 <?php endforeach; ?>
 <?php else : ?>
<h2 class="center">Not Found</h2>
<p class="center">Sorry, but you are looking for something that isn't here.</p>
<?php include (TEMPLATEPATH . "/searchform.php"); ?>
 <?php endif; ?>

Отображение сообщений из пользовательского запроса

...