自定义搜索:搜索帖子,但在结果中显示父页面

时间:2013-04-24 作者:Oh_Franck

我正在使用Wordpress 3.5.1和一个修改过的Twenty12主题。我的主要网站结构基于Smooth Slider 插件(jQuery Cycle).

我有Pages 仅包含短代码的(例如,[smoothslider id=\'4\']) 要显示Posts 指定给滑块。当我在网站上搜索时,它只会返回个人帖子的结果(当然也不会返回页面)。这不是我想要的,因为已经没有滑块了。这些帖子不应该单独显示。

我想做的是,不要让结果链接到单个帖子,而是让结果链接到父页面。但是贴子没有父项,因此需要从菜单顺序(?)并将结果设置为这些URL。

<小时>

Example

菜单:

汽车[第页-重定向到第一个孩子:汽车-1][第页-内容:带“sliderid=1”的快捷码]

  • 汽车-1a[贴子-附加到sliderid=1-内容:文本+img][li>
  • 汽车-1b[贴子-附加到sliderid=1-内容:文本+img][li>汽车-1c[贴子-附加到sliderid=1-内容:文本+img][li>/ul-Content:带“sliderid=2”的快捷码
    car-2a[后附至sliderid=2-内容:文本+img][后附至sliderid=2-内容:文本+img][后附至sliderid=2-内容:文本+img][后附至sliderid=2-搜索结果:

    • Results I get:<示例。com/car-1a,示例。com/car-1b,示例。com/car-2a等Results I want:<示例。com/CAR/CAR-1,示例。com/CAR/CAR-2等

  • 2 个回复
    SO网友:s_ha_dum

    我没有安装您的滑块,因此无法对此进行测试,但您需要以下内容:

    function get_parent_page() {
      if (is_singular()) {
        global $wpdb,$post;
        if (isset($post->ID)) {
          $slide = $wpdb->get_var("SELECT DISTINCT slide_id FROM {$wpdb->prefix}smooth_slider WHERE post_id = {$post->ID} LIMIT 1");
          if (!empty($parent)) {
            $parent = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE post_status = \'publish\' AND post_type = \'post\' AND post_content LIKE \\"%[smoothslider id=\'".$slide."\']%\\"");
            if (!empty($parent)) {
               wp_safe_redirect(get_permalink($parent));
            }
          }
        }
      }
    }
    add_action(\'template_redirect\',\'get_parent_page\');
    
    这是非常密集的查询,并且LIKE 查询并不是特别有效,但由于您没有任何其他方式来连接帖子,这是我的最佳想法。

    如果有效(同样,我无法测试),那么应该将单页结果的请求重定向回父级。我推荐这种方法,因为改变主搜索查询来实现这一点(我认为是非常困难的),而且几乎肯定会非常缓慢。你得写几个JOINs并更改立柱FIELDs和WHERE 条款我不可能在任何合理的时间内让它发挥作用。

    另一种选择是改变search.php 文件(或创建一个),以便使用的永久链接指向父帖子。您可以使用几乎相同的函数,只需传入post ID即可。

    function get_parent_page_permalink($postid) {
      global $wpdb;
      if (isset($postid)) {
        $slide = $wpdb->get_var("SELECT DISTINCT slide_id FROM {$wpdb->prefix}smooth_slider WHERE post_id = {$postid} LIMIT 1");
        if (!empty($parent)) {
          $parent = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE post_status = \'publish\' AND post_type = \'post\' AND post_content LIKE \\"%[smoothslider id=\'".$slide."\']%\\"");
          if (!empty($parent)) {
             return get_permalink($parent);
          }
        }
      }
    }
    
    这是服务器上更重的负载。在搜索中,每个结果都会有两个额外的查询,我相信,每个结果都会有另一个查询get_permalink.

    SO网友:Oh_Franck

    好吧,我已经弄明白了;在函数中添加了以下内容。php:

    add_filter( \'posts_request\', \'my_request_filter\', 10, 2 );
    
    function my_request_filter($sql, $query) {
        if($query->is_main_query() && is_search()) {
            $sql = "SELECT * FROM wp_posts WHERE post_content LIKE \'[smoothslider%\' AND post_parent !=\'0\'";
        }
        return $sql;
    }
    
    我知道,由于无法访问数据库或无法运行测试滑块,所以这只是猜测,所以我将检查您的答案是否为已接受的答案。谢谢你的帮助。

    结束

    相关推荐

    Search Form Not Working

    我使用的是基于2012主题的,我使用的是下面的脚本(是的,我知道包装器还不正确)。但是,它默认返回主页。有什么想法吗?<?php /** * The template for displaying Search Results pages. * */ get_header(); ?> <section id=\"primary\" class=\"site-content\"> <div id=\"conten