#wordpress #woocommerce
#wordpress #woocommerce woocommerce
Вопрос:
На сайте есть плагин Dokan. Теперь мне нужно добавить vendor_name к каждому продукту, например, в пользовательское мета-поле. И я попытался сделать что-то вроде этого:
$args = array(
'post_type' => 'product',
'posts_per_page' => -1
);
$products = new WP_Query( $args );
if ( $products->have_posts() ):
while ( $products->have_posts() ):
$vendor_id = get_post_field( 'post_author', get_the_id() );
$vendor = new WP_User($vendor_id);
$store_info = dokan_get_store_info( $vendor_id );
$store_name = $store_info['store_name'];
$productID = $product->get_id();
update_post_meta( $productID, 'vendor_name', $store_name );
$products->the_post();
endwhile;
endif;
Таким образом, я решил обновить метаданные для всех продуктов. Но когда я добавляю этот код в functions.php Сайт просто перестает загружаться, вернее, он загружается, но так медленно. Здесь нет никаких ошибок. Хотя я могу и ошибаться. Может быть, проблема не в коде, а в том, что на сайте более 18 000 товаров? Или, может быть, есть другой способ достичь нужной мне цели. Пожалуйста, помогите мне разобраться в этом.
Ответ №1:
Вы можете попробовать запустить этот код в действии WordPress и проверить некоторый аргумент запроса, чтобы он не загружался в обычном представлении. Это одноразовый процесс, который означает, что вы можете запустить этот скрипт самостоятельно.
add_action( 'wp', function(){
if( isset( $_REQUEST['add_vendor_meta'] ) amp;amp; $_REQUEST['add_vendor_meta'] == 'true' ){
$args = array(
'post_type' => 'product',
'posts_per_page' => -1
);
$products = new WP_Query( $args );
if ( $products->have_posts() ):
while ( $products->have_posts() ):
$products->the_post();
$vendor_id = get_post_field( 'post_author', get_the_id() );
$vendor = new WP_User($vendor_id);
$store_info = dokan_get_store_info( $vendor_id );
$store_name = $store_info['store_name'];
$productID = $product->get_id();
update_post_meta( $productID, 'vendor_name', $store_name );
endwhile;
wp_reset_postdata();
endif;
}
} );
А также убедитесь, что вы добавили wp_reset_postdata() после завершения цикла while, это помогает сбросить ваш пользовательский запрос и не влияет на основной запрос.