如果标题、内容或标签中存在关键字,Wordpress get_posts

Posted

技术标签:

【中文标题】如果标题、内容或标签中存在关键字,Wordpress get_posts【英文标题】:Wordpress get_posts if keyword exists in title, content or tag 【发布时间】:2015-10-15 06:56:12 【问题描述】:

我正在使用 get_posts 获取与搜索关键字匹配的帖子列表,问题是我 get_postss parameter 默认不搜索标签,使用 tag_slug__in 将不起作用如果关键字在标题中而不是在标签中。

我的搜索条件是:

    如果标题中存在关键字,则返回帖子 如果内容中存在关键字,则返回帖子 如果关键字是与帖子关联的标签,则返回帖子。

任何想法都会很棒。我尝试了“搜索一切”插件,但这似乎只适用于 WordPress 的默认搜索功能。

下面的代码是我尝试过的简化版本,并不是这不满足所有 3 个标准。

<?php

/* Set global query parameters */
$image_args = array(
    'posts_per_page' => (isset($_GET['show_all']) && $_GET['show_all'] == 'true')? 100000 : 20,
    'post_type' => 'attachment',
    'post_mime_type' => array('image/jpeg', 'image/png'),
    'meta_key' => 'language',
    'meta_value' => "(^".$languages."$|\"".$languages."\"\;)",
    'meta_compare' => 'REGEXP',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'media_category',
            'field' => 'term_id',
            'terms' => array($gallery_filter, $hotel->term_id),
            'operator' => 'AND',
        ),
    ),
);

/* If page numbert given, add offet */
if(!empty($page_no))
    $images_args['offset'] = 20*((int)$page_no-1);


/* If search term submitted, add it to the s parameter */
if(isset($_GET['search']))
    $image_args['tag_slug__in' = explode(" ", $_GET['search']);
    $image_args['s'] = urldecode($_GET['search_term']);

【问题讨论】:

我了解 WP_Query 参数并详细说明了我的尝试。我的查询中有很多条件逻辑,在这里粘贴代码会使它脱离上下文。我会尽力简化它。 @rnevius,我已经添加了我尝试过的代码或至少一个简化版本(由于生成示例的速度可能包含语法错误)。 如果WP_Query 支持支持嵌套字段查询的通用field_query 参数会很酷。构建这样一个插件将是一个长期项目,但我想起点可能是像this one 这样的提议。 @PieterGoosen @birgire 这绝对是核心的巨大奖励,甚至只是一个插件。长话短说,几个月来一直忙于一个支持referrer的大型分页插件,所有的类都完成了,我只需要写最后的函数,但坐下来写它们......变得懒惰了,我我又要弹吉他了,所以.... 是的,我同意,原生搜索可能更灵活。我认为这样的嵌套字段查询支持可能会解决 SO 或 WPSE 上的很多问题。让我们看看这会发生什么......(期待你的插件发布 - 玩吉他吧 ;-) @PieterGoosen 【参考方案1】:

您可以使用自己的查询。下面是一个例子

$querystr="
    SELECT *
        FROM $wpdb->posts, $wpdb->term_relationships, $wpdb->term_taxonomy, $wpdb->terms
            WHERE ($wpdb->terms.name = '$s'
            OR $wpdb->posts.post_content LIKE '%$s%'
        OR $wpdb->posts.post_title LIKE '%$s%')
        AND $wpdb->posts.ID = $wpdb->term_relationships.object_id
        AND $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id
        AND $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id
        ORDER BY $wpdb->posts.post_date DESC
";

$pageposts = $wpdb->get_results($querystr, OBJECT_K);

foreach ($pageposts as $post): setup_postdata($post);
    echo the_title() . '<br /><br />';
endforeach;

【讨论】:

【参考方案2】:

我使用wpdb 查询来获取结果。加入帖子和分类表,然后通过$search_title 获得不同的结果。希望这会奏效。 :)

global $wpdb;
$querystr= "SELECT DISTINCT $wpdb->posts.* FROM $wpdb->posts
                LEFT JOIN $wpdb->term_relationships
                    ON ( $wpdb->posts.ID = $wpdb->term_relationships.object_id )
                LEFT JOIN $wpdb->term_taxonomy
                    ON ( $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id )
                LEFT JOIN $wpdb->terms
                    ON ( $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id ) 

                WHERE ( $wpdb->terms.name LIKE '%$search_title%'
                    OR $wpdb->posts.post_content LIKE '%$search_title%'
                    OR $wpdb->posts.post_title LIKE '%$search_title%' )
                    AND $wpdb->posts.post_status = 'publish'
                    AND $wpdb->posts.post_type = 'product' 
                    ORDER BY $wpdb->posts.post_title ASC";

$query_object = $wpdb->get_results($querystr);

【讨论】:

【参考方案3】:

查看 Wordpress 提供的 Post Clauses 过滤器。它允许您将 mysql 语句直接插入到 WP 查询中。

【讨论】:

以上是关于如果标题、内容或标签中存在关键字,Wordpress get_posts的主要内容,如果未能解决你的问题,请参考以下文章

Python:如果XML标签不存在,我需要打印'Blank'和Output

实战Wordpres的CSRF漏洞利用

Wordpres标头背景图片

Azure 策略:如果所有者标签不存在或不是电子邮件地址,则拒绝

如何将 Qt 中的某些内容标记为过时(已弃用)?

如果表中不存在新的帖子标签,则存储它?