icopydoc
Ответы в темах
-
Форум: Плагины
Тема: Не обновляются плагины (в репозитории)По ходу они одну проблему закрыли ценой другой.
Закомитил сегодня плагин 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 Tagfield is invalid, the specified SVN tag/tags//does not exist./trunk/will be used instead. - The
Stable tagfield 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 минут само собой починилось, а у мея уже час и нифига((
Что блин происходит с вордпресом? Уже несколько дней обновление — это лотерея((Да в том то и дело, что так и приходится делать, открыл, прочитал, закрыл. И код становится громоздким. Я понимаю, что нужна безопасность. Но если WP позиционирует какие-то впшные функции, классы и тп безопаснее, чем стандартные средства php, то надо бы и синтаксис / возможности сохранять.
Ведь по сути если бы ->put_contents третьим параметром принимал всё те, же привычные FILE_APPEND, а уж четвертым добавленный разрабами вп параметр отвечающий за права на файл — была бы преемственность и простота миграции. С некоторыми пхп функциями, кстати, так и сделали. Но вот с записью файлов перемудрили.
А писать логи плагина в отдельный файл — нормальная практика. Очень часто такое встречал. Кстати старые крупные плагины с миллионами установок логи пишут через file_put_contents 🙂 Т.е они не перешли на новые требования вордпреса.
Форум: WooCommerce
Тема: Экспорт заказов с сайта в эксельВам по ходу вот этот плагин нужен 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'); }Форум: Разное
Тема: Дезинфекция, CURL и модерацияВам потом куча разработчиков спасибо скажет, т.к. все запросы сделанные с помощью
WP_Http::request()можно отладить или модифицировать фильтрами.Угу, в том числе те разрабы, кто пиратские про-версии делают) Если в основной плагин встраивать модуль проверки лицензии прошки, то в два счёта можно ломать. Понятное дело, что спиратить можно всё, что угодно, но пусть хотя бы помучаются))
- Ответ изменён 3 года назад пользователем icopydoc.
Форум: Проблемы и решения
Тема: Чем заменить new CURLFile?Зачем файл нужен?
@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 все запросы чётко, а загрузка файлов не идёт. От апи приходит ответ, что мол косяк с размерами изображения. Вообще малец негодую от того, что вп запрещает родной курл в пользу своих наработок считая его опасным, но официальные библиотеку с курлом — не опасны. Но то лирика конечно.
Форум: Разное
Тема: Дезинфекция, CURL и модерация@sergeybiryukov а подскажите, что-то не разобрался. А как при помощи этой wp_remote_request() впшной функции создать эквивалент CURLOPT_USERPWD такого круловского кода:
$userpwd = $pwd_arr['login'].':'.$pwd_arr['pwd']; // 'логин:пароль' curl_setopt($curl, CURLOPT_USERPWD, $userpwd);- Ответ изменён 3 года назад пользователем icopydoc.
Форум: Разное
Тема: Дезинфекция, CURL и модерацияСпасибо большое! Стало попонятнее.
Жалко, конечно, что напрямую курлом нельзя. Причем как-то странно. В рамках импортируемых библиотек — можно. А если я из этой же самой библиотеки одну функцию вынул, с целью не засорять лишним кодом то нельзя… Придётся создавать велосипед…
Ещё раз спасибо за ответы.Форум: Разное
Тема: Дезинфекция, CURL и модерация@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.
Форум: Проблемы и решения
Тема: float не срабатываетСпасибо большое!
Форум: WooCommerce
Тема: Создать атрибут и сразу значениеUPD
Гугление выкинуло на похожий топик https://wordpress.stackexchange.com/questions/315295/wp-error-on-attribute-term-insert
Прихожу к выводу, что нужно вызывать дополнительно
register_taxonomy($slug, array( 'product' ), array() );
Однако, в моём случае это не помогает…- Ответ изменён 4 года, 7 месяцев назад пользователем icopydoc.
Форум: Проблемы и решения
Тема: update_post_meta и производительностьА что на счёт извлечения данных? Как лучше вытаскивать большое число метаполей? get_post_meta или как-то иначе?
А версия про-плагина свежая?
Вообще напишите мне пожалуйста на support@icopydoc.ru
И пришлите скрины всех установленных про-плагинов. И версию базового.
И логи. Спасибо.
Ибо жалоб подобных не было с тех пор, как я переделал согласно советам в этом топике.Форум: Переводы
Тема: Куда обратиться, чтобы получить праваСпасибо большое!
Форум: Проблемы и решения
Тема: Почему слово Google под запретом?#pluginreview
Сори. Видимо я туплю, ночь уже на дворе.
Куда конкретно написать? Дайте ссылочку пожалуйста. Там онли инглиш или по русски тоже можно? - The