我正在使用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. " ";
}
?>
答案 0 :(得分:3)
这些天我不得不在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;
}
}
?>
我添加了一些评论,试图更好地帮助您。
现在事情变得简单了,你只需通过像
这样的jQuery插件调用你的页面$('#yourInput').autocomplete( "path_to/get_posts.php" );
答案 1 :(得分:2)
您可以直接使用wordpress in-build功能获取所有帖子标题
// The Query
query_posts( 'posts_per_page=-1' );
// The Loop
while ( have_posts() ) : the_post();
echo '<li>';
the_title();
echo '</li>';
endwhile;
答案 2 :(得分:0)
这里没有答案回答您的真实问题:
一些重要的事情:
$GLOBALS['wpdb']->esc_like()
$GLOBALS['wpdb']->get_col()
$GLOBALS['wpdb']->get_results()
,如果您想在一行中获取更多列$GLOBALS['wpdb']->tableBaseName
使代码可移植-照顾前缀 $GLOBALS['wpdb']->posts
post_status
是{ {1}},但publish
可能会根据您的需要而变化 ... post_type
与全球化variabl相同-今天的性能差异很小
post_type
这是更多的wordpress,但开销很小,因为尽管$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 . " ";
}
?>
有一个fields
参数,但是它只有以下选项:
'all'-所有字段(也是默认值),'ids'-仅ids,'id => parent'-...如果您传递其他任何内容,您仍然会得到所有,因此您仍然需要添加“全部” BUT -WP但是具有用于更改SELECT中字段的过滤器。
我试图使其与原始SQL版本相同,但但这取决于WP如何进行“搜索” -我认为new WP_Query()
表示1个单词+一些如果有更多的单词,则更多的逻辑。您可以利用用于get_posts()
的{{1}}过滤器,也可以在将%search%
添加到$clauses
的 INSTEAD 处添加自定义内容(请记住在不丢失的现有WHERE fields
后面附加)。同样,'s'
在导航,联系表单等情况下不会产生与原始查询总是相同的结果。
WP_Query还清理了输入变量,因此实际上不会逃脱$args
!
$clauses['where' .= "AND ...;
不要混淆-您仍然会得到post_type => 'any'
的数组-WP将向其中添加一些默认的属性和值,但实际上,它只会查询和填写您在其中指定的字段的真实值过滤器。
PS:我已经测试了这些-它们是有效的代码(至少在WP 5.4和PHP7上有效:))