如果帖子标题有关键词,如何查询帖子并自动分配类别

时间:2011-10-18 作者:Ravi

如何按当前日期查询帖子,并根据帖子标题上的关键字自动分配类别,例如如果标题包含“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++;
 }

1 个回复
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 了解更多详细信息。

希望这有帮助!

结束

相关推荐

当使用GET_CATEGORIES或类似工具时,是否也可以过滤包含某些标记的结果?

get_categories() 默认情况下,相关函数不会返回空类别-没有帖子的类别。我想,既然可能有一些底层代码检查帖子数量,那么是否可以额外过滤该列表,使其仅包括那些本身包含与特定标记相关联的帖子的类别?或者有没有一种简单的替代方法来获取这些信息?例如,如果我有一些贴子带有“audio”标签,我想用一种方法get_categories() (或类似结果),但仅检索包含带有“音频”标记的帖子的类别列表。我知道我可能必须直接使用标签ID。我只是在寻找“最好的”,或最合适的方式来做到这一点。谢谢