如何按当前日期查询帖子,并根据帖子标题上的关键字自动分配类别,例如如果标题包含“oranges”,则自动分配“oranges”类别
也许像这样的东西可以用于函数。php
function add_category_automatically($post_ID) {
global $wpdb,$post;
$today = getdate();
$query = new WP_Query( \'year=\' . $today["year"] . \'&monthnum=\' . $today["mon"] .\'&day=\' . $today["mday"] );
while ( $the_query->have_posts() ) : $the_query->the_post();
$post_title = get_the_title();
if (stripos($post_title, \'oranges\')!==false) {
$cat = array(8);
wp_set_object_terms($post_ID, $cat, \'category\');
}
endwhile;
}
add_action(\'publish_post\', \'add_category_automatically\');
上面的代码不起作用,虽然下面的代码起作用,但在我再次更新之前,它对现有帖子并不能起作用,所以我需要一个函数来按当前日期查询所有帖子,并且只有在找到今天的新帖子时才应运行该函数
function add_category_automatically($post_ID) {
global $wpdb,$post;
$post_title = get_the_title();
if (stripos($post_title, \'oranges\')!==false) {
$cat = array(8);
wp_set_object_terms($post_ID, $cat, \'category\');
}
}
add_action(\'publish_post\', \'add_category_automatically\');
更新时间:
我现在正在使用这段代码,如果我发布了一篇新文章,但对现有的文章不起作用,它就会起作用。。。。。它应该每次运行并检查数据库中的所有帖子,并自动分类帖子,但smhw不是
add_action( \'wp_insert_post\', \'update_post_terms\' );
function update_post_terms( $post_id ) {
if ( $parent = wp_is_post_revision( $post_id ) )
$post_id = $parent;
$post = get_post( $post_id );
if ( $post->post_type != \'post\' )
return;
$post_title = get_the_title();
if (stripos($post_title, \'oranges\')!==false) {
// add a category
$categories = wp_get_post_categories( $post_id );
$newcat = get_term_by( \'name\', \'oranges\', \'category\' );
array_push( $categories, $newcat->term_id );
wp_set_post_categories( $post_id, $categories );
}
}
我知道即使我弄明白了这一点,它也会给我的数据库带来很好的负载,但我正在寻找一种方法来做到这一点,比如每两个小时一个实例,或者类似的,请帮助!
Update 2 to check all posts and loop them to push the category
$postids = array();
//this is to tell the script to only pull posts that are labeled "publish"
$args=array(
\'post_type\' => \'post\',
\'post_status\' => \'publish\',
\'posts_per_page\' => -1,
\'caller_get_posts\'=> 1
);
$my_query = null;
$my_query = new WP_Query($args);
if ( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post();
$postids[]=$my_query->post->ID;
endwhile;
}
wp_reset_query(); // Restore global post data stomped by the_post().
$i = 0;
while ($num_of_posts > $i){
$post_id = $postids[$i];
add_action( \'wp_insert_post\', \'update_post_terms\' );
function update_post_terms( $post_id ) {
if ( $parent = wp_is_post_revision( $post_id ) )
$post_id = $parent;
$post = get_post( $post_id );
if ( $post->post_type != \'post\' )
return;
$post_title = get_the_title();
if (stripos($post_title, \'oranges\')!==false) {
// add a category
$categories = wp_get_post_categories( $post_id );
$newcat = get_term_by( \'name\', \'Oranges\', \'category\' );
array_push( $categories, $newcat->term_id );
wp_set_post_categories( $post_id, $categories );
}
}
$i++;
}
SO网友:Stephen Harris
第一个代码只对与您的查询匹配的帖子执行,即当天发布的帖子。类似于
$query = new WP_Query( \'post_type=post\' );
应该检索所有帖子,然后可以循环浏览它们并执行必要的操作。
一句警告的话。无论何时发布帖子,都会运行您的功能—因此,对于每个新发布的帖子,都会检查您的所有帖子,并(如有必要)将其添加到类别中。为了节省时间/不必要地查询数据库,您可能只想使用第一个函数一次(可能通过单击按钮触发),然后对所有新帖子使用第二个函数,它只检查正在发布的帖子。
Answer to updated question如果要安排重复该功能,请使用:
<?php wp_schedule_event($timestamp, $recurrence, $hook, $args); ?>
$timestamp
是计划的第一次出现的UNIX时间戳。
$recurrence
是一个字符串,用于描述其发生的规律(例如“每日”、“每小时”等),
$hook
是字符串形式的函数名,即“update\\u post\\u terms”。最后一点
$args
是函数的(可选)参数数组。
但就目前情况而言,您的功能需要$post_id
作为一个论据,只更新那篇文章。如果您想更新所有帖子(每日、每小时等),您可能需要另一个函数(定期调用)来循环所有帖子并调用上述函数。
请参见Codex page 了解更多详细信息。
希望这有帮助!