由于功能检查,WordPress 函数在 cron 运行 期间不工作

WordPress function dont works during cron run because of capability check

我需要你的帮助。我在 WordPress 中编写了一个自定义 cron 函数,它使用 WooCommerce 产品导入器 class 自动导入产品:

$update_importer = WC_Product_CSV_Importer_Controller::get_importer( $import_result, [
    'delimiter'       => ',',
    'start_pos'       => 0,
    'mapping'         => $mapping_columns,
    'update_existing' => true,
    'lines'           => apply_filters( 'woocommerce_product_import_batch_size', 30 ),
    'parse'           => true
] );

$update_results          = $update_importer->import();
$update_percent_complete = $update_importer->get_percent_complete();

一切都很好,而不是类别。在导入过程中通过管理面板解析和导入类别,而不是通过 cron 作业。

所以我开始深入研究 WooCommerce 并发现,在 WooCommerce 产品导入期间的解析函数中有一个检查功能检查:

// Don't allow users without capabilities to create new categories.
if ( ! current_user_can( 'manage_product_terms' ) ) {
    break;
}

由于 cron 作业是作为用户 0 执行的,因此检查失败并且没有导入任何类别。

我现在的想法是在导入之前手动设置管理员用户,并在导入完成后再次将其重置为 0:

wp_set_current_user( 1 );

$update_importer = WC_Product_CSV_Importer_Controller::get_importer( $import_result, [
    'delimiter'       => ',',
    'start_pos'       => 0,
    'mapping'         => $mapping_columns,
    'update_existing' => true,
    'lines'           => apply_filters( 'woocommerce_product_import_batch_size', 30 ),
    'parse'           => true
] );

$update_results          = $update_importer->import();
$update_percent_complete = $update_importer->get_percent_complete();

wp_set_current_user( 0 );

这似乎可行,但我担心这是否会为黑客打开一扇门,因为当客人或其他人(例如客户访问该站点,所有 crons 通常在 WordPress 中执行,以防它们过期。

我不太确定进程是否在不同的线程中运行...据我所知,PHP甚至不能进行多线程,所以不知道!

我很高兴能得到任何 advice/help。谢谢

如何在导入时将权限分配给“0”用户而不是登录管理员(大多数用户 ID 1 将是管理员用户)并在导入完成后删除权限。

add_action('set_current_user', 'custom_set_current_user');

function custom_set_current_user() {
    global $current_user;
    if (0 == $current_user->ID) {

        // add $cap capability to this user
        $current_user->add_cap('manage_product_terms');

    }
}

用户对象会像 - 导入完成后,移除能力。

// remove $cap capability from this user
$current_user->remove_cap('manage_product_terms');