如何将自定义字段值转换为标签

时间:2016-09-20 作者:pradip

我有一个网站,每个帖子上都有一个自定义字段(位置)。我想将每篇文章中每个自定义字段值的值更改为标记。

我尝试在这里搜索,但无法获得太多信息。

此处有一些有用的链接:

Plugin to auto convert custom fields to tag

我尝试过使用以下代码,但都不起作用。

    add_action(\'save_post\',\'custom_field_add_tags\');

function custom_field_add_tags($post_id) {

 $post = get_post($post_id);

 //get values of custom fields and put into array

 $tag1 = get_post_meta($post_id, \'key_1\', true);
 $tag2 = get_post_meta($post_id, \'key_2\', true);
 $tag3 = get_post_meta($post_id, \'key_3\', true);

 $tags_to_add = array($tag1, $tag2, $tag3);

 //now check if tag does not already exist (if no - add tag from custom field)

 $add_tags = array();

 foreach(get_the_terms($post_id, \'post_tag\') as $term) {

    if(!in_array($term->slug, $tags_to_add))
        $add_tags[] = $term->slug;
 }

 if(!empty($add_tags))
    wp_add_post_tags($post_id, implode(\',\', $add_tags));
}

Another :

    global $wpdb;

  $sql = "SELECT post_id , meta_value FROM ".$wpdb->prefix."postmeta WHERE meta_key = \'cp_additional_options\' ";

  $res = $wpdb->get_results( $sql ) ;

  if( !empty($res)){

   foreach( $res as $r ){

        $ret = wp_insert_term( $r->meta_value , \'pa_popular-features\' ); 

        if( !$ret->errors ){

         $term_id = $ret[\'term_id\'];

         wp_set_post_terms( $r->post_id, $term_id,  \'pa_popular-features\');

        } 

   }

  }
我网站上的文章数量很大。。90000多篇文章。

这可以通过一个简单的函数或通过MySQL命令来完成。

1 个回复
最合适的回答,由SO网友:cowgill 整理而成

由于这是一项一次性任务,因此最容易创建这样的迁移脚本。

Note: 它可能会超时(尝试处理90k行),具体取决于服务器的内存大小。

function my_migration_script() {
  global $wpdb;

  // Quick and dirty way to get post ids. Normally don\'t use this method.
  $post_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type = \'post\'" );

  // Loop through all ids.
  foreach ( $post_ids as $post_id ) {

    // Grab the location meta value if it exists.
    if ( $value = get_post_meta( $post_id, \'location\', true ) ) {

      // Remove any commas since it\'s used as a delimiter.
      $value = str_replace ( \',\', \'\', $value );

      // Create a tag based on the `location` custom field value.
      wp_add_post_tags( $post_id, $value );
    }
  }

  // Uncomment if you\'d rather delete without verifying first.
  // $wpdb->delete( $wpdb->postmeta, array( \'meta_key\' => \'location\' ) );
}

// Kick off the script.
my_migration_script();
最后,删除所有旧的location 直接从db自定义字段值(使用phpMyAdmin或任何db访问工具)。

DELETE FROM wp_postmeta WHERE `meta_key` = \'location\';
我将其放在脚本之外,以便您可以首先验证迁移是否成功,并在执行过程中节省php内存资源。

如果您没有phpMyAdmin访问权限,只需取消对脚本中上述行的注释,然后再次运行它。

Note: 如果标记已经存在,它将不会复制它,因此您可以多次运行脚本而不会造成伤害。