Не могу искать в своем произвольном типе записей?

30 сент. 2011 г., 02:01:22
Просмотры: 20.2K
Голосов: 0

Я добавил новый произвольный тип записей с названием: 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( __( '&laquo; Старые записи', 'vigilance' )); ?></div>
        <div class="alignright"><?php previous_posts_link( __( 'Новые записи &raquo;', '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);
0
Все ответы на вопрос 3
4

Вы пробовали 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, вы получите больше результатов)

30 сент. 2011 г. 02:27:03
Комментарии

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

JasonDavis JasonDavis
30 сент. 2011 г. 03:12:14

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

Brooke. Brooke.
30 сент. 2011 г. 22:16:23

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

JasonDavis JasonDavis
1 окт. 2011 г. 01:27:16

Я бы поискал другие pre_get_posts в вашей теме или другие вещи, которые могут нарушать работу

Brooke. Brooke.
1 окт. 2011 г. 09:25:53
1

прежде всего, настройка

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

Надеюсь, это сработает для вас.

30 сент. 2011 г. 02:28:21
Комментарии

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

JasonDavis JasonDavis
30 сент. 2011 г. 03:46:19
0

Возможно

'exclude_from_search' => false

и

и пересохраните постоянные ссылки, чтобы сбросить кеш

22 сент. 2017 г. 23:14:23