无法搜索我的自定义帖子类型?

时间:2011-09-29 作者:JasonDavis

我添加了一个新的自定义帖子类型,名为:website_bookmarks

我计划将其用作我的书签管理器(将我所有的书签从Google Chrome导出到我的自定义帖子类型),原因如下

可以轻松搜索书签可以添加标签(php、web设计等)

  • 可以添加说明来更好地解释书签
  • 可以查看和排序,但是我可以选择查看和排序
  • 可以从任何在线位置访问
  • 可以与我的读者共享我的书签(可以选择将书签标记为私有或公共,这样我就可以成为唯一查看私有书签的人)
  • 确定还有其他原因让这成为一个好主意
  • website_bookmarks 任何内容的帖子类型。

    我已使用隐藏字段修改了搜索表单

    <input type="hidden" name="post_type" value="website_bookmarks" /> 
    
    因此,在我的URI搜索页面上,我将看到。。。

    www.mydomain.com/?s=mysearchterm&post_type=website_bookmarks
    
    问题是它ONLY 显示我的常规博客文章的搜索结果,但没有来自我的自定义文章类型的结果。

    如果我删除s=mysearchterm 从URI现在就是这样

    www.mydomain.com/?post_type=website_bookmarks
    
    然后,它将显示我的自定义帖子类型中的所有帖子。这表明website_bookmarks 是我的帖子类型的正确名称,只是搜索部分工作不正常。它将从普通帖子中检索搜索结果,没有问题,只是从my website\\u bookmarks帖子类型中没有问题

    它不应该显示我的博客帖子的任何结果,而应该只显示我的自定义帖子类型的结果website_bookmarks

    有人能帮我吗?我不明白为什么它不起作用,我上面显示的修改搜索表单的代码,我在网上从其他人那里发现,它只需将搜索表单更改为我上面所做的,就可以在那里的博客上工作。

    下面是我的全部搜索。php文件

    <?php get_header(); ?>
    <?php if (have_posts()) : ?>
        <h1 class="pagetitle"><?php printf( __("Search results for <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="Comments"/>
        <div class="entries">
            <ul>
            <?php while (have_posts()) : the_post(); ?>
                <li><a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php esc_attr( sprintf( __( \'Permanent Link to %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; /* rewind or continue if all posts have been fetched */ ?>
            </ul>
        </div><!--end entries-->
        <div class="navigation">
            <div class="alignleft"><?php next_posts_link( __( \'&laquo; Older Entries\', \'vigilance\' )); ?></div>
            <div class="alignright"><?php previous_posts_link( __( \'Newer Entries &raquo;\', \'vigilance\' )); ?></div>
        </div><!--end navigation-->
    <?php else : ?>
        <h1 class="pagetitle"><?php printf( __("Search results for \'%s\'", "vigilance"), get_search_query()); ?></h1>
        <div class="entry">
            <p><?php printf( __( \'Sorry your search for "%s" did not turn up any results. Please try again.\', \'vigilance\' ), get_search_query());?></p>
            <?php get_search_form(); ?>
        </div><!--end entry-->
    <?php endif; ?>
    </div><!--end content-->
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>
    
    我甚至尝试在我的函数中使用下面的代码。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\');
    
    下面是我用来创建网站\\u书签帖子类型的代码,您可以看到我已启用query\\u var和public\\u queryable,并已将exclude\\u from\\u 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\', //website thumbnail
                \'excerpt\', //website description
                \'title\', //website title
                \'custom-fields\',
                \'comments\'
            )
        );   
        register_post_type(\'website_bookmarks\', $bookmark_args);
    

    3 个回复
    最合适的回答,由SO网友:Brooke. 整理而成

    你试过了吗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\');
    
    EDIT: 下面是我的工作示例代码:

    以下是我用于测试的CPT:

    add_action( \'init\', \'register_cpt_website_bookmarks\' );
    function register_cpt_website_bookmarks() {
    $labels = array(
    \'name\' => _x( \'Bookmarks\', \'website_bookmarks\' ),
    \'singular_name\' => _x( \'Bookmark\', \'website_bookmarks\' ),
    \'add_new\' => _x( \'Add New\', \'website_bookmarks\' ),
    \'add_new_item\' => _x( \'Add New Bookmark\', \'website_bookmarks\' ),
    \'edit_item\' => _x( \'Edit Bookmark\', \'website_bookmarks\' ),
    \'new_item\' => _x( \'New Bookmark\', \'website_bookmarks\' ),
    \'view_item\' => _x( \'View Bookmark\', \'website_bookmarks\' ),
    \'search_items\' => _x( \'Search Bookmarks\', \'website_bookmarks\' ),
    \'not_found\' => _x( \'No bookmarks found\', \'website_bookmarks\' ),
    \'not_found_in_trash\' => _x( \'No bookmarks found in Trash\', \'website_bookmarks\' ),
    \'parent_item_colon\' => _x( \'Parent Bookmark:\', \'website_bookmarks\' ),
    \'menu_name\' => _x( \'Bookmarks\', \'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 );
    } 
    
    链接:[已删除链接](搜索“书签”或“测试”,如果删除“post\\u类型”并搜索测试,您将获得更多结果)

    SO网友:Elio

    首先,设置

    \'exclude_from_search\' => true,
    
    将从搜索结果中排除CPT。必须将其设置为false。这个CPT Generator 到那时,快速编写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\' );
    
    希望这对你有用。

    SO网友:Jonas Lundman

    大概

    \'exclude_from_search\' => false
    
    以及

    并重新保存永久链接以刷新缓存

    结束

    相关推荐

    admin : search custom fields

    一年前@t31os用一个我无法访问的代码回复了一篇帖子:http://wordpress.org/support/topic/search-custom-field-data他的回答。。。我觉得自己很有冒险精神,所以我写了一个简单的插件。。http://wordpress.pastebin.ca/1736605管理员中的帖子搜索现在还将在检查匹配帖子时检查元键和元值…;)有没有办法获取代码以便我可以使用它?非常感谢你帕特里夏