• Почему вордпресс перетирает стили меню?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Меню вы выводите неправильно. Для них есть функция wp_nav_menu()
    Соблюдать ли классы меню WP? Можно. Но если не подходят - используйте Walker_Nav_Menu или фильтры чтобы заменить на свои. Но вообще если верстаете под WP, то лучше сразу верстайте под его классы, их не так много. Собирать тему потом будет легче и быстрее.
    Ответ написан
  • Как публикавать в WordPress по HTML-шалону?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Для этих задач есть post templates, которые с версии 4.7 (буквально 2 недельки осталось) уже по умолчанию у постов будут. Подробнее на make.wordpress.org. Раньше реализовывалось аналогичным образом, только программно. Кроме post templates можете делать произвольные template_parts для разного оформления и включать из с помощью conditional tags. Например, у вас будет папочка template-parts, в которой будут файлы content-single-categoryone.php, content-single-categorytwo.php и так далее. В шаблоне single.php делаете проверку на категорию и ее же слаг подставляете в get_template_part().
    Ответ написан
  • Почему не срабатывает SQL запрос?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы ловите имя базы, которую надо создать тут $create = $_POST['name'];
    А при создании используете другу переменную "CREATE DATABASE $db"
    Замените $db на $create. Или наоборот. Это раз.
    Два - не забудьте про валидацию данных $_POST.
    Ответ написан
    Комментировать
  • Как переделать фильтр (нужен пример) по произвольным полям wp через get_posts?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    https://codex.wordpress.org/Class_Reference/WP_Query
    https://codex.wordpress.org/Class_Reference/WP_Que...

    UPDATE:

    1. Создаем выпадающий список для фильтра со всеми уникальными значениями "брендов" (в соответствующем шаблоне - над Loop с постами, перед if( have_posts() ) ):
    <?php
    // Получаем все уникальные значения брендов
    $brands = $wpdb->get_col(
    	"SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = 'brand'"
    );
    
    // Если бренды есть - строим блок с фильтром
    if ( $brands ) : 
    ?>
    
    <div class="filter">
    	<span>Filter by brand:</span>
    	<select name="brand" id="brand">
    		<!-- Сброс фильтра в значение "все" (оно же по умолчанию)  -->
    		<option value="All" 
    				<?php echo ( empty( $_GET['brand'] ) || 'All' === $_GET['brand'] ) ? 'selected="selected"' : ''; ?>
    		>All</option>
    		<!-- Все бренды -->
    		<?php foreach ( $brands as $brand ) : ?>
    			<option value="<?php echo esc_html( $brand ); ?>" 
    					<?php echo ( ! empty( $_GET['brand'] ) && $brand === $_GET['brand'] ) ? 'selected="selected"' : ''; ?>
    			><?php echo esc_html( $brand ); ?></option>
    		<?php endforeach; ?>
    	</select>
    </div>
    
    <script>
    jQuery('#brand').on('change', function(){
    	window.location.href =  '<?php echo get_nopaging_url(); ?>' + '?brand=' + jQuery(this).val();
    });
    </script>
    <?php endif; ?>

    Конечно, этот кусочек javascript лучше перенести в свой файл скриптов, который подгружается через wp_enqueue_scripts(), данный пример для наглядности.

    2. Хукаемся в основной запрос перед его выполнением, отлавливаем переменную и модифицируем запрос (это в functions.php):
    /**
     * Меняем основной запрос по необходимости, непосредственно перед его выполнением, сохраняя все фичи (включая пагинацию)
     */
    function my_filter_posts( $query ) {
    
    	// Если это не главный запрос или админка - прекращаем выполнение
    	if( ! $query->is_main_query() || is_admin() ) {
    		return;
    	}
    
    	// Если есть GET-параметр brand с не пустым значением и оно не равно All - модифицируем запрос
    	if( ! empty( $_GET['brand'] ) && 'All' != $_GET['brand'] ) {
    		$query->set( 'meta_key', 'brand' );
    		$query->set( 'meta_value', sanitize_text_field( $_GET['brand'] ) );
    	}
    
    }
    add_action( 'pre_get_posts', 'my_filter_posts' );

    3. И еще нам понадобится утилитарная функция get_nopaging_url() которую мы использовали в js (добавляем ее тоже в functions.php):
    /**
     * Get current URL without /page/{pagenum}/ part if it's present
     */
    function get_nopaging_url() {
    
    	global $wp;
    
    	$current_url =  home_url( $wp->request );
    	$position = strpos( $current_url , '/page' );
    	$nopaging_url = ( $position ) ? substr( $current_url, 0, $position ) : $current_url;
    
    	return trailingslashit( $nopaging_url );
    
    }
    Ответ написан
    21 комментарий
  • Как организовать хранение данных для простого калькулятора?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Функции, рекомендованные KingAnton используются для хранения глобальных данных. В вашем случае речь идет о свойствах товаров, то есть записей будет некоторое количество и они будут привязаны к конкретным товарам. Хранится такое в таблице wp_postmeta, с помощью АПИ:
    add_post_meta()
    update_post_meta()
    get_post_meta()
    delete_post_meta()

    Для редактирования сделайте свой metabox.
    Ответ написан
    Комментировать
  • Медленный - быстрый сайт?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если у вас именно фильтры / поиск / аггрегация товаров жрут много времени (в том числе аякс-запросы, в виджетах и тд) - смотрите в сторону Elastic Search. WP_Query и его расширенная версия от WooCommerce не особо предназначены для такого объема данных. Будут ли они работать? О да, если железо с большим запасом. Но лучше перенести это все на Elastic Search, и сервер сильно выдохнет.

    Впрочем, по скринам у вас бекенд в принципе шустрый. Вопрос скорее во фронте. И вот тут надо смотреть, что именно его так насилует. Предположение Дмитрий по поводу тяжелой темы скорее всего верное. Попробуйте http/2, должно облегчить (а по хорошему это уже должно быть стандартом). Темку надо тестить и искать узкие места. Явно тонны javascript. Если много аякс-запросов шлет тема, смотрите можно ли запрашиваемые данные отдавать без ajax или хотя бы сделать fragment caching для этих данных и возвращать из сразу сгенерированными в конечный результат из памяти. В общем, в таких случаях надо дебажить на всех уровнях, искать узкие места и устранять их на корню.
    Ответ написан
    2 комментария
  • Как не допустить попадание тегов в бд и в то же время убрать экранирование перед кавычками в textarea?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    esc_html / esc_textarea используются на выводе текста в html / тег (в качестве атрибута например) или в textarea соответственно. Эти функции заменяют полученные html-символы (кавычки, угловые скобки) на коды символов, чтобы ваш html-код не побился.

    Для вырезания / кодирования тегов / символов при записи необходимо использовать функции из набора sanitize_*
    Ответ написан
    Комментировать
  • Почему не работает выпадающие вкладки bootstrap на внутренних страницах (на главной работает)?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Почти так, как подсказал mrusklon только функция чуть другая. get_template_directory возвращает путь, а нам нужен URL - get_template_directory_uri.
    <script type='text/javascript' src='<?php echo get_template_directory_uri(); ?>/boot-file/bootstrap.min.js'></script>

    Впрочем, этот способ все равно неправильный, скрипты и стили надо подгружать с помощью wp_enqueue_scripts()
    Ответ написан
    4 комментария
  • Как генерируется страница?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Зачем вы решили писать свой движок для того, что уже написано тысячу раз? Возьмите CMS и не траться время впустую. К тому же, у вас явно не хватает даже базовых знаний, чтобы реализовать поставленную задачу. Ничего личного.
    Ответ написан
  • Можно ли перенести базу данных из phpPgAdmin в phpMyAdmin?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Pg = PostgreSQL, My = MySQL. Это два разных движка SQL. Данные перенести можно. Впрочем, есть нюансы.
    Ответ написан
    2 комментария
  • Как рассчитывается популярность пользователя в BuddyPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если посмотреть код в buddypress/bp-core/bp-core-widgets.php, то на строчках 73-74 есть такое:
    if ( 'popular' == $instance['member_default'] )
        bp_member_total_friend_count();

    Вывод: популярность рассчитывается из общего количества френдов пользователя.
    Ответ написан
    Комментировать
  • Какую выбрать CMS для каталога товара без покупки?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    WordPress
    Ответ написан
    Комментировать
  • Что в данном примере делает parseInt?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    getComputedStyle возвращает объект, getPropertyValue из него забирает строчное значение, которое может (и будет в случае с top) содержать единицы измерения, например 100px. parseInt парсит это строчное значение (string) и возвращает только число из него (например, 100).
    Ответ написан
  • Создание custom page на wordpress с вызовом БД?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Бросьте это дело. Вы все делаете не так. В первую очередь, не надо ничего подобного даже пытаться делать внутри WP. Начните с азов.
    Ответ написан
    5 комментариев
  • Как создать запись при отправки письма в contact form 7?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    В этом случае плагин CF7 DB вам не нужен активным, а нужен для того, чтобы открыть его код и посмотреть как они это делают. Логика проста - перехватываете данные на хуке wpcf7_before_send_mail или wpcf7_submit, валидируете и создаете новый пост нужно типа с помощью функции wp_insert_post().
    Ответ написан
    Комментировать
  • Выпадающий список категорий wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Есть 2 варианта:

    1. При загрузке страницы через wp_localize_script выдать в документ json со всей структурой категорий, первый селект построить средствами PHP обычным образом, второй - строить по выбору первого селекта с помощью javascript. Подтягивание значений во второй селект будет мгновенное.

    2. При загрузке страницы строить только первый селект, при выборе значения аяксом слать запрос на сервер и получать дочерние элементы, которые и выводить во второй селект.

    Ну и по выбору значения во втором селекте с помощью javascript запускать поиск.

    ЗЫ: Хоть Тостер и не биржа для поиска исполнителей, но если сами не справитесь - контакты в профиле.
    Ответ написан
    Комментировать
  • Как получить массив файлов из кастомного метабокса?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Потому что WordPress заботливо изолирует опасные места, чтобы всякие начинающие разработчики не вставляли в систему свои небезопасные фичи. Есть АПИ ядра для этих задач, используйте его. Загрузка файлов должна происходить через него. Читайте доку.
    Ответ написан
  • Как работают VPS хостеры?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я уже почти 4 года использую VPS от Amazon и Digital Ocean - для себя и многих клиентов. Тарифные планы разные - от 1 ядра до 32х. Некоторые ресурсы под постоянным плотным трафиком и более-менее регулярными DDoS разного масштаба в силу специфики проектов. И ни разу не сталкивался с таким понятием как оверселлинг или просьбой "сменить тарифный план" из-за высокой нагрузки. И ни разу нигде не было указано, что вы можете использовать какие-то 20% ресурсов в течение какого-то времени - юзай на здоровье все 100% все время, сколько душе угодно. В этом и смысл VPS - ты оплачиваешь ресурс и используешь его без ограничений. Если хостер пишет всякие дополнительные условия - это уже не VPS, а обычный шаред, но с дополнительными опциями (ssh и тд).
    Ответ написан
    4 комментария
  • Как сделать автоматическую обрезку фото для страницы магазина woocommerce?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    WordPress и так по умолчанию кропит thumbnail размер, остальные тоже можно задать чтобы кропились. Это будет автоматически. Но далеко не всегда такой кроп подойдет. Если же речь о том, что картинки она загружает огромного размера, и они на сервере не нужны, то есть плагины для того, чтобы ресайзить оригинал и удалять его. Например, Imsanity
    Ответ написан
  • Как отдавать nginx только изменившиеся файлы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Есть такой прием, называется "cache busting". Это когда к ссылке на статический файл (jpg, css, js и тд) добавляется произвольная или инкрементальная строка в виде GET-параметра, как написал axeax, только там может быть что угодно. Есть 2 основных способа - либо рандомный набор символов, либо "версия", имеющая смысл - это может быть стандартное версионирование кода / релиз - например, ?v=2.0.1 или же кусок хеша коммита из VCS, например ?v=952f038. Сам параметр может называться как угодно - v, rnd, version и тд. Смысл в том, что если присутствует такой параметр и он отличается от предыдущего - браузер запросит свежий файл. Но Google PageSpeed например на эти параметры ругается. Впрочем, пусть идет лесом, его рекомендации далеко не всегда имеют смысл.
    Ответ написан
    Комментировать