查询所有wordpress帖子标题

Posted

技术标签:

【中文标题】查询所有wordpress帖子标题【英文标题】:Query all wordpress post titles 【发布时间】:2012-09-27 07:31:30 【问题描述】:

我正在使用 Wordpress 自动建议使用 this snippet 的代码

目前它正在搜索所有标签,我希望它只搜索帖子标题。任何帮助表示赞赏。

这是一个 sql 查询,调用所有帖子需要修改的所有标签。

 <?php global $wpdb;
 $search_tags = $wpdb->get_results("SELECT name from wp_terms WHERE name LIKE '$search%'");
 foreach ($search_tags as $mytag)
   
     echo $mytag->name. " "; 
   
  ?>

【问题讨论】:

【参考方案1】:

您可以直接使用wordpress内置功能获取所有帖子标题

// The Query
query_posts( 'posts_per_page=-1' );

// The Loop
while ( have_posts() ) : the_post();
    echo '<li>';
    the_title();
    echo '</li>';
endwhile;

【讨论】:

非常感谢@GBD,但我修改了查询以实现我想要的。希望这对其他人也有帮助。codeget_results("SELECT post_title from wp_posts WHERE post_title LIKE '$search%'"); foreach ($search_tags as $mytag) echo $mytag->post_title. " "; ?>code【参考方案2】:

这些天我不得不在 wordpress 主题中做一些请求。 在您的情况下(获取标题比获取标签更容易,如您的示例链接中所示),这些事情可以更容易完成(我猜)。

首先,您必须创建一个 php 页面来获取帖子。你可能知道你不能在独立的 php 文件中使用 wp 的东西,所以你的文件(让我们称之为 get_posts.php )看起来像

<?php
  // Include the file above for being able to use php stuff
  // In my case this file was in a folder inside my theme ( my_theme/custom_stuff/get_posts.php ).
  // According to this file position you can modify below path to achieve wp-blog-header.php from wp root folder
  include( '../../../../wp-blog-header.php' ); 

  // Get all published posts. 
  $list_posts = get_posts( array( 'numberposts' => -1 ) );

  // Get "q" parameter from plugin
  $typing = strtolower( $_GET["q"] );

  //Save all titles
  $list_titles = array();
  foreach( $list_posts as $post )  $list_titles[] = $post->post_title; 

  // To see more about this part check search.php from example
  foreach( $list_titles as $title ) 
    if( strpos( strtolower( $title ), $typing ) )
      echo $title;
    
  

?>

我添加了一些 cmets 试图更好地帮助你。

现在事情变得简单了,你只需要通过像这样的 jQuery 插件调用你的页面

$('#yourInput').autocomplete( "path_to/get_posts.php" );

【讨论】:

这并不能真正回答问题,并且可能是性能很重,因为它会在加载所有数据后进行搜索 - 有关更多信息,请在此页面上查看我的答案 (***.com/a/62425438/1835470)【参考方案3】:

这里的答案都没有回答你真正的问题:

如何查询 JUST 帖子标题

“原始 SQL”方式:

一些重要的事情:

对 SQL 进行转义搜索!(对标签搜索也这样做!)使用$GLOBALS['wpdb']-&gt;esc_like() 如果您只需要 1 列,可以使用 $GLOBALS['wpdb']-&gt;get_col()$GLOBALS['wpdb']-&gt;get_results() 如果您想在一行中获取更多列 使用$GLOBALS['wpdb']-&gt;tableBaseName 使您的代码具有可移植性——注意前缀例如$GLOBALS['wpdb']-&gt;posts 在查询帖子时,您还必须考虑要查询的post_typepost_status=>通常您想要的post_statuspublish,但post_type 可能会根据您的需要而有所不同 WordPress 表“帖子”包含所有帖子类型 - 帖子、页面、自定义、还有导航、联系表单等! => 我强烈建议使用明确的post_type 条件(s) 在哪里! :)

...$GLOBALS 与全球化变量相同 - 今天的性能差异很小

<?php
  // to get ALL published post titles of ALL post types (posts, pages, custom post types, ...
  $search_post_titles = $GLOBALS['wpdb']->get_col(
    "SELECT post_title from $GLOBALS['wpdb']->posts
     WHERE (
       (post_status = 'publish')
       AND
       (post_title LIKE '$GLOBALS['wpdb']->esc_like($search)%') 
     )
     ORDER BY post_title ASC
  "); // I also added ordering by title (ascending)
  // to only get post titles of Posts(Blog)
  // you would add this to conditions inside the WHERE()
  // AND (post_type = 'post')
  // for Posts&Pages
  // AND ((post_type = 'post') OR (post_type = 'page'))

  // test output:
  foreach ($search_post_titles as $my_title) 
   echo $my_title . " "; 
  

?>

WP_Query 方式

这是更多的wordpress,但有一点开销,因为虽然new WP_Query()/get_posts()有一个fields参数,但它只有选项: 'all' - 所有字段(也是默认值),'ids' - 只是 ids,'id=>parent' - ...如果你传递任何其他内容,你仍然会得到所有,所以您仍然需要添加“全部”BUT - 但是 WP 具有用于更改 SELECT 中的字段的过滤器。

我试图使其与原始 SQL 版本相同,但这取决于 WP 如何进行“搜索” - 我认为这是 %search% 1 个单词 + 更多逻辑如果有更多的话。您可以利用用于fields$clauses 过滤器来添加您的自定义位置INSTEAD's' 添加到$args(请记住附加到不-失去现有的 WHEREs $clauses['where' .= "AND ...;)。此外,post_type =&gt; 'any' 在导航、联系表单等情况下并不总是产生与原始查询相同的结果......

此外,WP_Query 会清理输入变量,因此实际上不要转义 $args

<?php
  $args = [
      'fields' => 'all', // must give all here and filter SELECT(fields) clause later! 
      'posts_per_page'   => -1, // -1 == get all
      'post_status'      => 'publish',
      's'                => $search,
      // I also added ordering by title (ascending):
      'orderby'          => 'title',
      'order'            => 'ASC',
      'post_type'        => 'any', // all "normal" post types
      // 'post_type'     => 'post', // only "blog" Posts
      // 'post_type'     => ['post', 'page'], // only blog Posts & Pages   
  ];

  $onlyTitlesFilter = function($clauses, $query) 
        // "fields" overrides the column list after "SELECT" in query
        $clauses['fields'] = "$GLOBALS['wpdb']->posts.post_title";

        return $clauses; // !FILTER! MUST RETURN!
  ;
  $onlyTitlesFilterPriority = 999;

  // add filter only for this query
  add_filter('posts_clauses', $onlyTitlesFilter, $onlyTitlesFilterPriority, 2);
  // Pro-tip: don't use variable names like $post, $posts - they conflict with WP globals!
  $my_posts = (new WP_Query($args))->get_posts();

  // !IMPORTANT!
  // !remove the filter right after so we don't affect other queries!
  remove_filter('posts_clauses', $onlyTitlesFilter, $onlyTitlesFilterPriority);

  // test output:
  // note that I used "my"_post NOT just $post (that's a global!)
  foreach($my_posts as $my_post) 
    echo $my_post->post_title . " ";
  

?>

不要混淆 - 你仍然会得到 WP_Posts 的数组 - WP 会向其中抛出一些默认属性和值,但实际上它只会查询并使用你在过滤器中指定的字段填写真实值.

PS:我已经测试过这些 - 它们是工作代码(至少在 WP 5.4 和 PHP7 上:))

【讨论】:

以上是关于查询所有wordpress帖子标题的主要内容,如果未能解决你的问题,请参考以下文章

php 查询帖子类型wordpres

PHP Wordpres,查询最新帖子

Wordpres,查询最新帖子

查询所有wordpress帖子标题

从帖子标题获取 WordPress 帖子 ID

是否可以从插件触发将 <script> 注入到多个 wordpress 帖子中?