Ответы в темах

Просмотр 15 ответов — с 1 по 15 (всего 132)
  • По ходу они одну проблему закрыли ценой другой.

    Закомитил сегодня плагин https://wordpress.org/plugins/yml-for-yandex-market/

    Но уже час прошел, а версии 4.7.3 нет.
    Сначала появилось сообщение, что

    During the last import of your plugin the following warnings were encountered. This message is visible only to the plugin authors & committers.

    • The Stable Tag field is invalid, the specified SVN tag /tags// does not exist. /trunk/ will be used instead.
    • The Stable tag field is missing or invalid. Note: We ask you no longer attempt to use /trunk/ as stable, so that all plugins can be rolled back.

    Но супустя какоте-то время само собой изсчезло. Вот только исчезнуть исчезло, а апдейт как бы недоступен, так и остался.
    Гуглил — тут вот тоже похожий случай.
    https://wordpress.org/support/topic/plugin-svn-tag-does-not-exist/
    Но у него за 30 минут само собой починилось, а у мея уже час и нифига((

    Что блин происходит с вордпресом? Уже несколько дней обновление — это лотерея((

    Автор icopydoc

    (@icopydoc)

    Да в том то и дело, что так и приходится делать, открыл, прочитал, закрыл. И код становится громоздким. Я понимаю, что нужна безопасность. Но если WP позиционирует какие-то впшные функции, классы и тп безопаснее, чем стандартные средства php, то надо бы и синтаксис / возможности сохранять.

    Ведь по сути если бы ->put_contents третьим параметром принимал всё те, же привычные FILE_APPEND, а уж четвертым добавленный разрабами вп параметр отвечающий за права на файл — была бы преемственность и простота миграции. С некоторыми пхп функциями, кстати, так и сделали. Но вот с записью файлов перемудрили.

    А писать логи плагина в отдельный файл — нормальная практика. Очень часто такое встречал. Кстати старые крупные плагины с миллионами установок логи пишут через file_put_contents 🙂 Т.е они не перешли на новые требования вордпреса.

    Вам по ходу вот этот плагин нужен https://ru.wordpress.org/plugins/order-export-for-woocommerce/

    там у них есть видос. На нем примерно на 5-й минуте то что вам надо показывают.

    PS а вообще там и написать не особо сложно (если без интерфейса, чисто под себя). Я когда-то тоже что-то похоже писал.

    Типа такого будет:

    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx; 
    function eotefw_tt() {
    	$spreadsheet = new Spreadsheet();
    	$sheet = $spreadsheet->getActiveSheet();
    	$sheet->setCellValue('A1', '№');
    	$sheet->setCellValue('B1', 'Дата');
    	$sheet->setCellValue('C1', 'Имя'); 
    	$sheet->setCellValue('D1', 'Email'); 
    
    	$sheet->setCellValue('E1', 'ИТОГО'); 
    	$sheet->setCellValue('F1', 'Cкидка'); 
    	$sheet->setCellValue('G1', 'Позиций');
    	$sheet->setCellValue('H1', 'Статус');	
    	$sheet->setCellValue('I1', 'ID-товара');
    	$sheet->setCellValue('J1', 'Стоимость товара');		
    
    /*	$sheet->setCellValue('E1', 'ID-товара'); 
    	$sheet->setCellValue('F1', 'Цена'); 
    	$sheet->setCellValue('G1', 'Cкидка'); 
    	$sheet->setCellValue('H1', 'ИТОГО'); 
    	$sheet->setCellValue('I1', 'Статус');*/
    
    	$query = new WC_Order_Query(array('limit' => -1, 'return' => 'ids', 'orderby' => 'date', 'order' => 'DESC',));
    	$orders_arr = $query->get_orders();	
    	if (!empty($orders_arr)) {
    	 $numrow = 2;
    	 for ($i = 0; $i < count($orders_arr); $i++) {
    	   // https://wp-kama.ru/function/wc_get_order
    	   $order = wc_get_order($orders_arr[$i]); // объект с деталями заказа
    	   $data = $order->get_data();
    	   
    	   
    	   // var_dump($data);
    
    	   $email = (string)$data['billing']['email'];
    	   $first_name = (string)$data['billing']['first_name'];
    	   $date_created = $data['date_created']->date('Y-m-d');
    	   
    	   $namecell = 'A'.$numrow; $sheet->setCellValue($namecell, $orders_arr[$i]);
    	   $namecell = 'B'.$numrow; $sheet->setCellValue($namecell, $date_created);
    	   $namecell = 'C'.$numrow; $sheet->setCellValue($namecell, $first_name);
    	   $namecell = 'D'.$numrow; $sheet->setCellValue($namecell, $email);
    	   $discount_total = $data['discount_total'];
    	   $namecell = 'F'.$numrow; $sheet->setCellValue($namecell, $discount_total);
    	   $total = $data['total'];
    	   $namecell = 'E'.$numrow; $sheet->setCellValue($namecell, $total);
    	   $status = $data['status'];
    	   $namecell = 'H'.$numrow; $sheet->setCellValue($namecell, $status);
    
    	   /*echo '<br/>ID: '.$orders_arr[$i];
    	   echo '<br/>Email: '.$email;
    	   echo '<br/>Дата: '.$date_created;	
    	   echo '<br/>Имя: '.$first_name;*/
    	   
    	   $order_items = $order->get_items(); // объект 
    	   $nnn = count($order_items);
    	   foreach($order_items as $item_id => $item) {
    		   // ID элемента можно получить из ключа массива или так:
    		   $item_id = $item->get_id();
    	   
    		   // данные элемента заказа в виде массива
    		   $item_data = $item->get_data();
       
    		   $namecell = 'I'.$numrow; $sheet->setCellValue($namecell, $item_data['product_id']);
    		   $namecell = 'J'.$numrow; $sheet->setCellValue($namecell, $item_data['total']);
    		   $namecell = 'G'.$numrow; $sheet->setCellValue($namecell, $nnn);
    		   /* echo '<br/>Название: '.$item_data['name'];
    		   echo '<br/>ID-товара: '.$item_data['product_id'];
    		   echo '<br/>Цена: '.$item_data['total'];	*/
    		   if ($nnn > 1) {$numrow++;}
    	   } 
    	   $numrow++;
    	 }
    	}
       
    	$writer = new Xlsx($spreadsheet);
    	$upload_dir = (object)wp_get_upload_dir();
    	$writer->save( $upload_dir->basedir.'/hello world.xlsx');
    }
    Автор icopydoc

    (@icopydoc)

    Вам потом куча разработчиков спасибо скажет, т.к. все запросы сделанные с помощью WP_Http::request() можно отладить или модифицировать фильтрами.

    Угу, в том числе те разрабы, кто пиратские про-версии делают) Если в основной плагин встраивать модуль проверки лицензии прошки, то в два счёта можно ломать. Понятное дело, что спиратить можно всё, что угодно, но пусть хотя бы помучаются))

    • Ответ изменён 3 года назад пользователем icopydoc.
    Автор icopydoc

    (@icopydoc)

    Зачем файл нужен?

    @sazonische по АПИ отправляется на сервер. Далее массив вторым параметром в эту функцию:

    function response_to_serv($request_url, $postfields_arr = [ ], $headers_arr = [ ], $request_type = 'POST', $pwd_arr = [ ], $encode_type = 'json_encode', $timeout = 30, $proxy = '', $debug = false, $sep = PHP_EOL, $useragent = 'PHP Bot') {
    		if (!empty($this->get_debug())) {$request_url = $request_url.'?dbg='.$this->get_debug();}
    
    		/* 
    		 * if (!empty($pwd_arr)) {
    		 *	if (isset($pwd_arr['login']) && isset($pwd_arr['pwd'])) {
    		 *		$userpwd = $pwd_arr['login'].':'.$pwd_arr['pwd']; // 'логин:пароль'
    		 *		curl_setopt($curl, CURLOPT_USERPWD, $userpwd);
    		 *	}
    		 * }
    		 **/
    
    		$answer_arr = [];
    		$answer_arr['body_request'] = null;
    		if ($request_type !== 'GET') { 
    			switch($encode_type) {
    				case 'json_encode':
    					$answer_arr['body_request'] = json_encode($postfields_arr);
    					break;
    				case 'http_build_query':
    					$answer_arr['body_request'] = http_build_query($postfields_arr);
    					break;
    				case 'dont_encode':
    					$answer_arr['body_request'] = $postfields_arr;
    					break;
    				default:
    					$answer_arr['body_request'] = json_encode($postfields_arr);
    			}
    		}
    
    		$args = [
    			'body'			=> $answer_arr['body_request'],
    			'method'		=> $request_type,
    			'timeout'		=> $timeout,
    			// 'redirection' => '5',
    			'user-agent'	=> $useragent,
    			// 'httpversion' => '1.0',
    			// 'blocking'    => true,
    			'headers'     => $headers_arr,
    			'cookies'     => [ ],
    		];
    		$result = wp_remote_request($request_url, $args);
    
    		if (is_wp_error($result)) {
    			$answer_arr['errors'] = $result->get_error_message(); // $result->get_error_code();
    			$answer_arr['body_answer'] = null;
    		} else {
    			$answer_arr['status'] = true; // true - получили ответ
    			// Разделение полученных HTTP-заголовков и тела ответа
    			$response_body = $result['body'];
    			$http_code = $result['response']['code'];
    			$answer_arr['http_code'] = $http_code;
    			
    			if ($http_code == 200) {
    				// Если HTTP-код ответа равен 200, то возвращаем отформатированное тело ответа в формате JSON
    				$decoded_body = json_decode($response_body);				
    				$answer_arr['body_answer'] = $decoded_body;
    			} else {
    				// Если тело ответа не пустое, то производится попытка декодирования JSON-кода
    				if (!empty($response_body)) {
    					$decoded_body = json_decode($response_body);
    					if ($decoded_body != null) {
    						// Если ответ содержит тело в формате JSON, 
    						// то возвращаем отформатированное тело в формате JSON
    						$answer_arr['body_answer'] = $decoded_body;
    					} else {
    						// Если не удалось декодировать JSON либо тело имеет другой формат, 
    						// то возвращаем преобразованное тело ответа
    						$answer_arr['body_answer'] = htmlspecialchars($response_body);
    					}
    				} else {
    					$answer_arr['body_answer'] = null;
    				}
    			}
    			// Вывод необработанных HTTP-заголовков запроса и ответа
    			// $answer_arr['header_request'] = curl_getinfo($curl, CURLINFO_HEADER_OUT); // Заголовки запроса
    			$answer_arr['header_answer'] = $result['headers']; // Заголовки ответа
    		}
    
    		// var_dump($answer_arr['body_answer']);
    		return $answer_arr;
    	}

    Парадокс в том, что в этой функции раньше использовался курл, который заменили на wp_remote_request. С курлом всё чётко. А с wp_remote_request все запросы чётко, а загрузка файлов не идёт. От апи приходит ответ, что мол косяк с размерами изображения. Вообще малец негодую от того, что вп запрещает родной курл в пользу своих наработок считая его опасным, но официальные библиотеку с курлом — не опасны. Но то лирика конечно.

    • Ответ изменён 3 года назад пользователем icopydoc.
    • Ответ изменён 3 года назад пользователем icopydoc.
    Автор icopydoc

    (@icopydoc)

    @sergeybiryukov а подскажите, что-то не разобрался. А как при помощи этой wp_remote_request() впшной функции создать эквивалент CURLOPT_USERPWD такого круловского кода:

    $userpwd = $pwd_arr['login'].':'.$pwd_arr['pwd']; // 'логин:пароль'
    curl_setopt($curl, CURLOPT_USERPWD, $userpwd);
    
    • Ответ изменён 3 года назад пользователем icopydoc.
    Автор icopydoc

    (@icopydoc)

    Спасибо большое! Стало попонятнее.
    Жалко, конечно, что напрямую курлом нельзя. Причем как-то странно. В рамках импортируемых библиотек — можно. А если я из этой же самой библиотеки одну функцию вынул, с целью не засорять лишним кодом то нельзя… Придётся создавать велосипед…
    Ещё раз спасибо за ответы.

    Автор icopydoc

    (@icopydoc)

    @yube по ссылке вижу вот такой текст:

    There are other HTTP methods, such as PUT, DELETE, TRACE, and CONNECT. These methods will not be covered in this article as there aren’t pre-built methods to utilize them in WordPress, nor is it yet common for APIs to implement them.

    Если я правильно понимаю, то средствами вп PUT не послать адекватно, а значит нужно использовать curl. Так и как мне быть? Что ему можно на этот счёт написать? Типа скинуть эту цитату и сказать, что мне курл нужен?))

    Потому, что это будет плагин, который будет использоваться на разных сайтах с совершенно разной системой ЧПУ. Решение должно быть универсальным.

    PS если я буду использовать что-то типа:
    $request = urldecode($_SERVER['REQUEST_URI']);
    внутри функции, что в моем предыдущем сообщении — это будет верным подходом? Или есть чисто впшные хитрости парсить запрос в таких случаях, как у меня?

    • Ответ изменён 3 года, 4 месяца назад пользователем icopydoc.

    Спасибо большое!

    UPD
    Гугление выкинуло на похожий топик https://wordpress.stackexchange.com/questions/315295/wp-error-on-attribute-term-insert
    Прихожу к выводу, что нужно вызывать дополнительно
    register_taxonomy($slug, array( 'product' ), array() );
    Однако, в моём случае это не помогает…

    • Ответ изменён 4 года, 7 месяцев назад пользователем icopydoc.

    А что на счёт извлечения данных? Как лучше вытаскивать большое число метаполей? get_post_meta или как-то иначе?

    Автор icopydoc

    (@icopydoc)

    А версия про-плагина свежая?
    Вообще напишите мне пожалуйста на support@icopydoc.ru
    И пришлите скрины всех установленных про-плагинов. И версию базового.
    И логи. Спасибо.
    Ибо жалоб подобных не было с тех пор, как я переделал согласно советам в этом топике.

    Спасибо большое!

    #pluginreview

    Сори. Видимо я туплю, ночь уже на дворе.
    Куда конкретно написать? Дайте ссылочку пожалуйста. Там онли инглиш или по русски тоже можно?

Просмотр 15 ответов — с 1 по 15 (всего 132)