匹配和合并不同分类中的术语

时间:2015-03-06 作者:Josh M

我有两种不同的分类法中的一些作者姓名,其中术语的格式有两种不同但重叠的方式。每个分类法中大约有400个术语,与大约700篇文章相关。(造成这种混乱的原因是从旧版本的Expression Engine进行了复杂的迁移。)

第一个分类法只是默认标记,合并后,我将删除所有这些术语。格式如下,不带引号,其中“123”可以是任何三位或四位数字:

"[123] LastName, FirstName"

我将保留的另一个税种叫做作者税(author\\u tax)。其格式更简单:

"FirstName LastName"

当然,我想保留这两种分类法的所有当前post关联。最好的情况是,仅当FirstName和LastName匹配时,才合并术语。但即使只是匹配姓氏,也可以节省手动合并的时间。我可能会得到一些不好的匹配,但清理这些匹配比手动合并400个术语要容易得多。

这是可能的还是我在做梦?

(顺便说一句,这些人不是传统的WordPress作者,而是WP驱动的杂志网站的作者。因此,这些都与用户表无关。)

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

抓住所有的贴子标签,在上面循环。如果它被pattern match, 检查是否等效author_tax 术语存在。如果没有,请创建它。

现在可以构建两个堆栈:一个用于author_tax 附加到帖子的条款,以及post_tag\'要删除的。

$post_tags = get_the_terms( $post_id, \'post_tag\' );
$authors =
$remove = array();

foreach ( $post_tags as $post_tag ) {
    if ( preg_match( \'/^\\[[0-9]+\\] *([^,]+), *(.+)$/\', $post_tag->name, $match ) ) {
        $fullname = "$match[2] $match[1]";

        if ( $term = get_term_by( \'name\', $fullname, \'author_tax\' ) ) // Already exists
            $authors[] = ( int ) $term->term_id;
        elseif ( ! is_wp_error( $term = wp_insert_term( $fullname, \'author_tax\' ) ) ) // Create new author tax term
            $authors[] = ( int ) $term[\'term_id\'];

        $remove[] = ( int ) $post_tag->term_id;
    }
}

$authors && wp_set_object_terms( $post_id, $authors, \'author_tax\', true /* Append terms */ );
$remove && wp_remove_object_terms( $post_id, $remove, \'post_tag\' );
要么在所有帖子的foreach/while循环中弹出此消息,要么对其进行批处理。有了700,你应该能够尽可能地保持直线跑increase the timeout.

此代码未经测试。先备份!

Update: 因为这是一次性的,所以只需创建一个文件import.php 在WordPress安装文件夹中,然后在第一行加载WordPress:

require \'./wp-load.php\';
ini_set( \'max_execution_time\', 300 );

$posts = get_posts( \'posts_per_page=-1&fields=ids\' );
foreach ( $posts as $post_id ) {
    // Code from above
}
从浏览器中点击该脚本(&A);等待I would run a test with just one post to start & check everything works.

结束

相关推荐

ACF Taxonomy Object term Null

我正在使用高级自定义字段插件在某些页面上放置分类法复选框。此复选框将过滤该页面上通过etc提取的数据。使用ACF网站上的示例(旨在使用术语对象输出)-<?php $terms = get_field(\'taxonomy_field_name\'); if( $terms ): ?> <ul> <?php foreach( $terms as $term ): ?> &l