@ustrechko

Можно ли упростить следующий код?

Помог мне тут один товарищ и спасибо ему еще раз.

мне нужно было обойти сотни тысяч записей в wordpress и изменить дублирующиеся url. Вот такой код он мне дал:

<?php

if (empty($wp)) {
    require_once('wp-config.php');
}

global $wpdb;

$posts = $wpdb->get_results(
    "SELECT
    	p.ID, p.post_name
   	 FROM
   	 	wp_posts p
     WHERE
        p.post_type = 'post' AND p.post_status = 'publish'");

$double = array();
$rewrite = array();

foreach($posts as $post){
  if (!array_key_exists($post->post_name,$double)){
    $double[$post->post_name] = 0;
  }else{
    $double[$post->post_name] += 1;
    $rewrite[$post->ID] = $post->post_name . "-" . $double[$post->post_name];
  }
}

foreach($rewrite as $key => $value){
  $wpdb->update( 'wp_posts',
    array( 'post_name' => $value ),
    array( 'ID' => $key )
  );
}


код отлично работает, но теперь у меня скопилось большое количество постов, которые не позволяет обойти ОЗУ хостинга. Можно ли его упростить или какие-нибудь еще варианты.

Ошибка такого рода Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes) in /home/.../wp-db.php on line 1841

php_value memory_limit 5096M не дает результата
  • Вопрос задан
  • 41 просмотр
Пригласить эксперта
Ответы на вопрос 1
HectorPrima
@HectorPrima
программист
Вот этот скрипт выполненный на mysql должен ко всем именам постов добавить цифру если есть дубль. Времени уже нет поэтому сильно не проверял лучше на бекапе проверить.
DELIMITER $$

DROP PROCEDURE IF EXISTS p2;
CREATE PROCEDURE `p2` ()  
BEGIN  
	DECLARE var_id int;
	DECLARE var_name varchar(200);
	DECLARE new_name varchar(200);
	DECLARE exist int;
	DECLARE counter int;
	
	DECLARE cursor_i CURSOR FOR    
	SELECT 
		p.ID, p.post_name 
	FROM	
		wp_posts p 
	WHERE 
		p.post_type = 'post' AND p.post_status = 'publish';
	  
	OPEN cursor_i;
	read_loop: LOOP
		FETCH cursor_i INTO var_id, var_name;
		
		SET new_name = var_name;
		SET counter = 0;
		check_double: LOOP
			SELECT COUNT(*) FROM wp_posts p WHERE p.post_type = 'post' AND p.post_status = 'publish' AND p.post_name = new_name INTO exist;
			IF (exist > 0) THEN
				SET counter = counter + 1;
				SET new_name = CONCAT(var_name, counter);
				ITERATE check_double;
				/*LEAVE check_double;*/
			END IF;	
			UPDATE wp_posts p SET p.post_name = new_name WHERE p.ID = var_id;
			INSERT INTO qq (ss) VALUES(new_name);
			LEAVE check_double;
		END LOOP check_double;
		
	END LOOP read_loop;
	CLOSE cursor_i;        
END$$
CALL p2;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы