Не могу искать в своем произвольном типе записей?
Я добавил новый произвольный тип записей с названием: website_bookmarks
Я планирую использовать его как менеджер закладок (собираюсь экспортировать все мои закладки из Google Chrome в мой произвольный тип записей) по следующим причинам:
- Можно легко искать закладки
- Можно добавлять теги (php, веб-дизайн и т.д...)
- Можно добавлять описания для лучшего объяснения закладки
- Можно просматривать и сортировать как угодно
- Можно получить доступ из любого места в интернете
- Можно делиться закладками с читателями (будет возможность отмечать закладку как Приватную или Публичную, чтобы только я мог видеть Приватные)
- Уверен, есть и другие причины, почему это хорошая идея
Сейчас моя единственная проблема - это поиск. Я не могу заставить WordPress (последняя версия) искать что-либо в типе записей website_bookmarks.
Я модифицировал свою поисковую форму, добавив скрытое поле
<input type="hidden" name="post_type" value="website_bookmarks" />
Поэтому в URI на странице поиска я вижу...
www.mydomain.com/?s=mysearchterm&post_type=website_bookmarks
Проблема в том, что он показывает результаты поиска ТОЛЬКО для моих обычных записей блога и никаких результатов из моего произвольного типа записей.
Если я удалю s=mysearchterm
из URI, чтобы получилось
www.mydomain.com/?post_type=website_bookmarks
тогда он покажет ВСЕ записи моего произвольного типа. Это показывает, что website_bookmarks - правильное название для моего типа записей, просто поиск не работает корректно. Он возвращает результаты поиска из обычных записей без проблем, но ничего из типа website_bookmarks
Он не должен показывать никаких результатов из моего блога, а ТОЛЬКО результаты из моего произвольного типа записей website_bookmarks
Может кто-то помочь? Я не могу понять, почему это не работает. Код, который я показал выше для модификации поисковой формы, я нашел в интернете, где другие говорили, что это работало в их блогах просто изменением поисковой формы как я сделал выше.
Ниже мой полный файл search.php
<?php get_header(); ?>
<?php if (have_posts()) : ?>
<h1 class="pagetitle"><?php printf( __("Результаты поиска для <span>%s</span>", "vigilance"), get_search_query()); ?></h1>
<img class="archive-comment"src="<?php echo get_template_directory_uri(); ?>/images/comments-bubble-archive.gif" width="17" height="14" alt="Комментарии"/>
<div class="entries">
<ul>
<?php while (have_posts()) : the_post(); ?>
<li><a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php esc_attr( sprintf( __( 'Постоянная ссылка на %s', 'vigilance' ), the_title_attribute( 'echo=false' ) ) ); ?>"><span class="comments_number"><?php comments_number( '0', '1', '%', '' ); ?></span><span class="archdate"><?php the_time( __( 'M.j.y', 'vigilance' )); ?></span><?php the_title(); ?></a></li>
<?php endwhile; /* перемотать или продолжить, если все записи получены */ ?>
</ul>
</div><!--конец entries-->
<div class="navigation">
<div class="alignleft"><?php next_posts_link( __( '« Старые записи', 'vigilance' )); ?></div>
<div class="alignright"><?php previous_posts_link( __( 'Новые записи »', 'vigilance' )); ?></div>
</div><!--конец navigation-->
<?php else : ?>
<h1 class="pagetitle"><?php printf( __("Результаты поиска для '%s'", "vigilance"), get_search_query()); ?></h1>
<div class="entry">
<p><?php printf( __( 'Извините, поиск по "%s" не дал результатов. Пожалуйста, попробуйте снова.', 'vigilance' ), get_search_query());?></p>
<?php get_search_form(); ?>
</div><!--конец entry-->
<?php endif; ?>
</div><!--конец content-->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Я даже пробовал использовать этот код в моем файле functions.php без успеха...
function mySearchFilter($query) {
$post_type = $_GET['post_type'];
if (!$post_type) {
$post_type = 'any';
}
if ($query->is_search) {
$query->set('post_type', $post_type);
};
return $query;
};
add_filter('pre_get_posts','mySearchFilter');
Ниже мой код для создания типа записей website_bookmarks, вы можете видеть, что я включил query_var и publicly_queryable и установил exclude_from_search в true и false для тестирования обоих вариантов, без успеха
$bookmark_args = array(
'labels' => $bookmark_labels,
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'bookmark',
'with_front' => false),
'taxonomies' => array('bookmark_tags'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 4,
'can_export' => true,
'supports' => array(
'thumbnail', //миниатюра сайта
'excerpt', //описание сайта
'title', //заголовок сайта
'custom-fields',
'comments'
)
);
register_post_type('website_bookmarks', $bookmark_args);

Вы пробовали if (!isset($post_type))
или if(empty($post_type))
?? Например, я бы попробовал так:
function mySearchFilter($query) {
$post_type = $_GET['post_type'];
if ($query->is_search) {
if (!empty($post_type)) {
$query->set('post_type', $post_type);
}
}
return $query;
}
add_filter('pre_get_posts','mySearchFilter');
ИЗМЕНЕНО: Вот мой рабочий пример кода:
Вот мой CPT (пользовательский тип записи), использованный для тестирования:
add_action( 'init', 'register_cpt_website_bookmarks' );
function register_cpt_website_bookmarks() {
$labels = array(
'name' => _x( 'Закладки', 'website_bookmarks' ),
'singular_name' => _x( 'Закладка', 'website_bookmarks' ),
'add_new' => _x( 'Добавить новую', 'website_bookmarks' ),
'add_new_item' => _x( 'Добавить новую закладку', 'website_bookmarks' ),
'edit_item' => _x( 'Редактировать закладку', 'website_bookmarks' ),
'new_item' => _x( 'Новая закладка', 'website_bookmarks' ),
'view_item' => _x( 'Просмотреть закладку', 'website_bookmarks' ),
'search_items' => _x( 'Искать закладки', 'website_bookmarks' ),
'not_found' => _x( 'Закладки не найдены', 'website_bookmarks' ),
'not_found_in_trash' => _x( 'В корзине закладок не найдено', 'website_bookmarks' ),
'parent_item_colon' => _x( 'Родительская закладка:', 'website_bookmarks' ),
'menu_name' => _x( 'Закладки', 'website_bookmarks' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'supports' => array( 'title', 'editor' ),
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => false,
'publicly_queryable' => true,
'exclude_from_search' => false,
'has_archive' => true,
'query_var' => true,
'can_export' => true,
'rewrite' => true,
'capability_type' => 'post'
);
register_post_type( 'website_bookmarks', $args );
}
Ссылка: [ссылка удалена] (ищите "Закладка" или "Test" и если убрать "post_type" и искать test, вы получите больше результатов)

Привет, да, я пробовал похожее и только что попробовал это, но все равно не сработало

Должно быть что-то не так с вашим типом записи. Я использовал приведенный выше код, изменил свою поисковую строку, и он отлично работает. Я тестировал на WP 3.3, не знаю, какую версию используете вы.

Я только что попробовал на другой теме, и это работает, но не работает на моей теме. Значит, ЧТО-ТО в моей теме мешает корректной работе. Спасибо за тест, я бы никогда не додумался проверить, работает ли это только в одной теме, а в другой нет.

прежде всего, настройка
'exclude_from_search' => true,
исключит пользовательский тип записи (CPT) из результатов поиска. Это значение должно быть установлено в false. CPT Generator от Themergency будет полезен для быстрого создания ваших CPT.
Для включения CPT в архивы или поиск я обычно использую этот код, который немного отличается от вашего:
function include_custom_post_types( $query ) {
$custom_post_type = get_query_var( 'post_type' );
if ( is_archive() ) {
if ( empty( $custom_post_type ) ) $query->set( 'post_type' , get_post_types() );
}
if ( is_search() ) {
if ( empty( $custom_post_type ) ) {
$query->set( 'post_type' , array(
'post', 'page', 'yourcpt'
)
);
}
}
return $query;
}
add_filter( 'pre_get_posts' , 'include_custom_post_types' );
Надеюсь, это сработает для вас.

Привет, я изменил на 'exclude_from_search' => true,
просто для теста, сейчас снова установлено false, но это не решает мою проблему. Спасибо за ссылку на CPT Generator, это удобно! Я попробовал ваш код выше, заменил 'post', 'page', 'yourcpt'
на 'post', 'page', 'website_bookmarks'
, однако в результатах поиска по-прежнему нет записей из моего CPT website_bookmarks, для меня очень странно, что ничего не работает
