通过SQL在INSERT INTO之后更新表wp_Term_soronomy.count

时间:2017-06-28 作者:Tom

Short description: 我已经创建了一组术语,并使用下面的SQL代码将它们附加到某个自定义帖子的现有分类法中。完成此操作后,我想更新wp\\u term\\u分类法。计数我将其设置为0(哑?)因此,新的术语没有出现在搜索表单中(但它们确实出现在个人自定义帖子中)。将count设置为1可以修复此问题,但仍然“错误”,我担心这可能会导致后续问题。

虽然我的代码略高于n00b状态,但SQL或Wordpress中的答案仍然有效。

My solution: 设置wp\\U term\\u分类法。对于新术语,计数为1,这样它就会出现在整个网站上。我可以在搜索中使用它们(很重要),但标记云大小错误/不正确(很好),我担心会遇到未知问题。

Details: 我已经为一个名为“jeans”的自定义帖子类型创建了一个名为“csf\\U brand”的分类法,我正在添加许多术语。与其编辑已经创建的数百篇自定义帖子中的每一篇,我想我应该使用SQL对它们进行批处理,使用与自定义分类相关的3个表。

首先,我创建我的新术语。

INSERT INTO `wp_nhyb_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES
(10, \'GAP\', \'gap\', 0); --there\'s a bunch more lines like this adding in new terms
接下来,我将我的术语附加到适当的分类法中。0不是正确的计数,但如果可以避免的话,计算它不是我感兴趣的事情。

INSERT INTO `wp_nhyb_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`) VALUES
(10, 10, \'csf_brand\', \'\', 0, 0); --Here is where I could use 1 instead of 0
最后,我通过post ID(object\\u ID)将术语附加到我的自定义post类型

INSERT INTO `wp_nhyb_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES
(125, 10, 0);
这是可行的。但是wp\\U term\\U分类法。count不是0,因此它们不会出现在我的搜索中(例如,我有一个页面可以通过下拉菜单搜索品牌,但它们不是选项)。如果我在浏览器中编辑自定义帖子,则保存该帖子可识别新术语并更正计数。但这不是一个很好的过程,因为我最终会错过一些东西。

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

您可以运行wp_update_term_count_now 执行此操作后的php函数:

https://developer.wordpress.org/reference/functions/wp_update_term_count_now/

这就叫私人_update_post_term_count

https://developer.wordpress.org/reference/functions/_update_post_term_count/

如果查看其来源,您将看到术语计数是如何更新的(这是在后端保存帖子时完成的):

function _update_post_term_count( $terms, $taxonomy ) {
    global $wpdb;

    $object_types = (array) $taxonomy->object_type;

    foreach ( $object_types as &$object_type )
        list( $object_type ) = explode( \':\', $object_type );

    $object_types = array_unique( $object_types );

    if ( false !== ( $check_attachments = array_search( \'attachment\', $object_types ) ) ) {
        unset( $object_types[ $check_attachments ] );
        $check_attachments = true;
    }

    if ( $object_types )
        $object_types = esc_sql( array_filter( $object_types, \'post_type_exists\' ) );

    foreach ( (array) $terms as $term ) {
        $count = 0;

        // Attachments can be \'inherit\' status, we need to base count off the parent\'s status if so.
        if ( $check_attachments )
            $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status = \'publish\' OR ( post_status = \'inherit\' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) = \'publish\' ) ) AND post_type = \'attachment\' AND term_taxonomy_id = %d", $term ) );

        if ( $object_types )
            $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = \'publish\' AND post_type IN (\'" . implode("\', \'", $object_types ) . "\') AND term_taxonomy_id = %d", $term ) );

        /** This action is documented in wp-includes/taxonomy.php */
        do_action( \'edit_term_taxonomy\', $term, $taxonomy->name );
        $wpdb->update( $wpdb->term_taxonomy, compact( \'count\' ), array( \'term_taxonomy_id\' => $term ) );

        /** This action is documented in wp-includes/taxonomy.php */
        do_action( \'edited_term_taxonomy\', $term, $taxonomy->name );
    }
}

SO网友:Tom J Nowell

解决方案很简单,请使用给定的API,而不是使用原始SQL

创建新术语:

wp_insert_term

要在对象/帖子/用户等上添加或设置术语,请执行以下操作:

wp_set_object_terms

还有一个同义词wp_set_post_terms 但这只是一个薄薄的包装。如果您使用的是标准数据类型,则无需在WordPress中编写原始SQL

结束

相关推荐

通过自定义字段SQL获取用户的电子邮件

我正在尝试构建一个SQL查询,以检索“options\\u futures”自定义字段等于“options”的用户列表我编写了此查询,但不起作用:$data = $wpdb->get_results( \'SELECT user_email FROM $wpdb->users LEFT JOIN $wpdb->usermeta WHERE options_futures=\"Options\"\', ARRAY_A );