查询所有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,但我修改了查询以实现我想要的。希望这对其他人也有帮助。code
get_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']->esc_like()
如果您只需要 1 列,可以使用 $GLOBALS['wpdb']->get_col()
$GLOBALS['wpdb']->get_results()
如果您想在一行中获取更多列
使用$GLOBALS['wpdb']->tableBaseName
使您的代码具有可移植性——注意前缀例如$GLOBALS['wpdb']->posts
在查询帖子时,您还必须考虑要查询的post_type和post_status=>通常您想要的post_status
是publish
,但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 => '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帖子标题的主要内容,如果未能解决你的问题,请参考以下文章