• Как использовать один header на всем проекте?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    У меня в проектах классы собираются следующим образом, сделано по аналогии с функциями body_class() и post_class()

    if ( ! function_exists( 'get_wpgen_header_classes' ) ) {
    
    	/**
    	 * Get classes for header container.
    	 *
    	 * @param string $class Additional header classes.
    	 *
    	 * @return array
    	 */
    	function get_wpgen_header_classes( $class = '' ) {
    
    		// Add elements to array.
    		$classes   = array();
    		$classes[] = 'header';
    
    		if ( has_custom_header() ) {
    			$classes[] = 'header--background-image';
    		}
    
    		if ( is_front_page() || is_home() ) {
    			$classes[] = 'header-bg';
    		} else {
    			$classes[] = 'custom-class';
    		}
    
    		// Check the function has accepted any classes.
    		if ( isset( $class ) && ! empty( $class ) ) {
    			if ( is_array( $class ) ) {
    				$classes = array_merge( $classes, $class );
    			} elseif ( is_string( $class ) ) {
    				$classes = array_merge( $classes, explode( ' ', $class ) );
    			}
    		}
    
    		$classes = apply_filters( 'get_wpgen_header_classes', $classes );
    
    		// Usage:
    		/*add_filter( 'get_wpgen_header_classes', 'my_header_classes' );
    		if ( ! function_exists( 'my_header_classes' ) ) {
    			function my_header_classes( $classes ) {
    				$classes[] = 'my-class';
    				return array_unique( $classes );
    			}
    		}*/
    
    		return array_unique( (array) $classes );
    	}
    }
    
    if ( ! function_exists( 'wpgen_header_classes' ) ) {
    
    	/**
    	 * Display classes for header container.
    	 *
    	 * @param string $class Additional header classes.
    	 * @param bool   $echo  Echo or return header classes.
    	 *
    	 * @return string
    	 */
    	function wpgen_header_classes( $class = '', $echo = true ) {
    
    		$classes = get_wpgen_header_classes( $class );
    
    		if ( $echo ) {
    			echo 'class="' . esc_attr( implode( ' ', $classes ) ) . '"';
    		} else {
    			return 'class="' . esc_attr( implode( ' ', $classes ) ) . '"';
    		}
    	}
    }


    Ваше условие я дописал в функцию, осталось дописать логику для ваших оставшихся 4 разных header-ов. В шаблоне функция используется так:

    <header id="header" <?php wpgen_header_classes(); ?>>


    Так же в функцию можно передавать классы строкой или массивом

    <header id="header" <?php wpgen_header_classes( 'new-class' ); ?>>
    Ответ написан
    Комментировать
  • Как записать путь до медиафайлов wordpress через php?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Есть нативная функция wp_upload_dir() для получения массива данных о папке с медиафайлами
    Ответ написан
    4 комментария
  • Фильтр товаров wordress ( НЕ woo)?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    greencost, Если через ajax + metaquery, то будет как-то так:
    Все фильтры завернуты в форму и представляют собой элементы формы: селекты, радиокнопки, чекбоксы. У элементов форм есть name. Обязательно должно быть скрытое поле с названием функции
    <form id="filter">
      <div class="search-holder">
        <input type="search" name="s" id="s" class="input-text" placeholder="<?php esc_attr_e( 'Поиск вакансий' ); ?>" value="<?php echo get_search_query(); ?>">
    
        <?php
        $terms_loaction = get_terms(
          array(
            'taxonomy' => 'location',
            'hide_empty' => false,
          )
        );
        ?>
    
        <?php
        if ( $terms_loaction ) :
          ?>
          <select name="city" class="select-block mobile-hide">
            <option value=""><?php esc_html_e( 'Город' ); ?></option>
            <?php
            foreach ( $terms_loaction as $location ) :
              ?>
              <option value="<?php echo esc_attr( $location->term_id ); ?>"><?php echo esc_html( $location->name ); ?></option>
            <?php endforeach; ?>
          </select>
        <?php endif; ?>
    
        <ul class="filter-list mobile-hide">
          <li>
            <label class="checkbox-block">
              <input type="checkbox" name="is_free_live">
              <span><?php esc_html_e( 'Бесплатное проживание' ); ?></span>
            </label>
          </li>
          ...
        </ul>
        <button type="submit" class="ajax-filter-btn btn"><?php esc_html_e( 'Найти вакансию' ); ?></button>
      </div>
      <input type="hidden" name="action" value="filter_vacancy">
    </form>


    php обработчик будет выглядеть как-то так:
    add_action( 'wp_enqueue_scripts', function() {
    
      $my_args = array(
        'post_type' => 'offers',
        'posts_per_page' => -1,
        'tax_query' => array(
          'relation' => 'AND',
        ),
        'meta_query' => array(
          'relation' => 'AND',
        ),
      );
    
      $my_query = new WP_Query( $my_args );
    
      wp_register_script('ajax_js', get_stylesheet_directory_uri() . '/js/ajax.js', array('jquery'), time(), true);
    
      wp_localize_script( 'ajax_js', 'ajax_obj', array(
        'ajaxurl' => admin_url('admin-ajax.php'),
        'posts' => json_encode( $my_query->query_vars ),
        'current_page' => get_query_var( 'paged' ) ? get_query_var('paged') : 1,
        'max_page' => $my_query->max_num_pages,
      ) );
    
      wp_enqueue_script('ajax_js');
    });
    
    // FILTER
    function filter_vacancy(){
    
      $args = array(
        'post_type' => 'offers',
        'posts_per_page' => -1,
        'tax_query' => array(
          'relation' => 'AND',
        ),
        'meta_query' => array(
          'relation' => 'AND',
        ),
      );
    
      if( !empty( $_POST['city'] ) && $_POST['city'] ) {
        $args['tax_query'][] = array(
          'taxonomy' => 'location',
          'field' => 'id',
          'terms' => $_POST['city'],
        );
      }
    
      if( isset( $_POST['is_free_equipment'] ) && $_POST['is_free_equipment'] ) {
        array_push($args['meta_query'][] = array(
            'key'         => 'is_free_equipment',
            'value'       => true,
            'compare'     => '=',
          )
        );
      }
    
      if( !empty( $_POST['s'] ) ) {
        $args['s'] = sanitize_text_field($_POST['s']);
      }
    
      query_posts( $args );
    
      global $wp_query;
    
      if ( have_posts() ) :
        ob_start();
    
        while ( have_posts() ) :
          the_post();
          get_template_part( 'template-parts/offers/offers', 'list' );
        endwhile;
        $response = ob_get_contents();
        ob_end_clean(); 
      else:
        $response = 'По запросу нет вакансий';
      endif;
    
      echo json_encode( array(
        'posts'       => json_encode( $wp_query->query_vars ),
        'max_page'    => $wp_query->max_num_pages,
        'found_posts' => $wp_query->found_posts,
        'content'     => $response,
      ) );
      die();
    }
    add_action('wp_ajax_filter_vacancy', 'filter_vacancy');
    add_action('wp_ajax_nopriv_filter_vacancy', 'filter_vacancy');


    ajax обработчик в упрощенном виде както так
    $('#filter').on('submit', function (e) {
      e.preventDefault();
      var filter = $(this);
      $.ajax({
        type: 'POST',
        url: ajax_obj.ajaxurl,
        data: filter.serialize(),
        dataType : 'json',
        beforeSend: function(xhr){
    
        },
        success: function (data) {
          $('.offers-list').html(data.content);
          ajax_obj.posts = data.posts;
        },
      });
    });
    Ответ написан
    Комментировать
  • Как не дать скопировать свой сайт на wordpress?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак.
    Любой, кто озаботится вашим сайтом, тупо придет сюда на Тостер, и ему на блюдечке все расскажут и покажут.
    Здесь много таких любителей дармовщинки.
    Ответ написан
    2 комментария
  • Кто и как подключает скрипты и стили на своем wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    is_home() — проверяет показывается ли страница с последними постами

    Хочу отметить функцию get_theme_file_uri(), которую редко используют из-за кучи старых гайдов. Она ищет файл сначала в дочерней теме, если его там нет, то берет его из основной

    В качестве версии файла, четвертым параметром удобно передавать время последнего его изменения с помощью filemtime(). Это нужно, чтобы браузер не кешировал измененные файлы и всегда показывал только актуальную версию

    Т.к. я часто меняю что-то программно, то и id у меня могут измениться, а вот за слагами я слежу для SEO, поэтому во всех проверках типа is_page() проверяю слаги постов. Но это уже вкусовщина

    function custom_scripts_init() {
    
    	// общие стили
    	wp_enqueue_style( 'common-styles', get_theme_file_uri( 'assets/css/common.min.css' ) , array(), filemtime( get_theme_file_path( '/assets/css/common.min.css' ) ) );
    
    	// общие скрипты 
    	wp_enqueue_script( 'common-scripts', get_theme_file_uri( 'assets/js/common.min.js' ), array( 'jquery' ), filemtime( get_theme_file_path( '/assets/js/common.min.js' ) ), true );
    
    	// скрипты для страницы постов
    	if ( is_home() ) {
    		wp_enqueue_script( 'home-scripts', get_theme_file_uri( 'assets/js/home.min.js' ), array( 'jquery' ), filemtime( get_theme_file_path( '/assets/js/home.min.js' ) ), true );
    	}
    
    	// скрипты для массива страниц
    	if ( is_page( ['sample-page', 'contacts'] ) ) {
    		wp_enqueue_script( 'page-scripts', get_theme_file_uri( 'assets/js/page.min.js' ), array( 'jquery' ), filemtime( get_theme_file_path( '/assets/js/page.min.js' ) ), true );
    	}
    
    }
    add_action( 'wp_enqueue_scripts', 'custom_scripts_init' );
    Ответ написан
    3 комментария
  • Как создать на Wordpress страницу ответа на GET-запрос?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    PHP-код, встроенный в страницу будет разбирать строку GET-запроса от API сервиса бронирования и, на основании данных из запроса, формировать сообщение о результате бронирования.


    Это и есть ответ на ваш вопрос. Если условие верно — загружаем один шаблон, в противном случае другой

    if ( $condition ) {
    	get_template_part( 'templates/thankyou' );
    } else {
    	get_template_part( 'templates/common' );
    }
    Ответ написан
    1 комментарий
  • Как вывести записи определённой категории?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    а чем вас не устаревает нормальный вывод через шаблон archive-recipes.php
    Ответ написан
    6 комментариев
  • Выдать права для пользователя на 7 дней?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вряд ли из-за 15 строк кода кто-то будет писать настолько уникальный функционал

    // устанавливаем роль и дату начала тестового периода
    function set_user_test_period() {
    
    	$current_date = date( 'd-m-Y H:i:s' );
    
    	// пишем в мету юзера текущее время
    	add_user_meta( $user_id, '_test_period_start_date', $current_date, true );
    
    	$user = new WP_User( $user_id );
    
    	// добавляем роль участника
    	$user->add_role( 'contributor' );
    
    }
    
    
    // проверка завершения тестового периода
    function check_user_test_period() {
    
    	$current_date = date( 'd-m-Y H:i:s' );
    	$user_id = get_current_user_id();
    
    	$test_period_start_date = get_user_meta( $user_id, '_test_period_start_date', true );
    
    	$user = new WP_User( $user_id );
    
    	// проверяем, что текущая дата больше тестового периода
    	if ( strtotime( $current_date ) > strtotime( $test_period_start_date . ' + 7 days' ) ) {
    		// убираем роль участника
    		$user->remove_role( 'contributor' );
    	}
    
    }


    Писал без тестов, может что-то не работать и логику нужно доработать по необходимости
    Ответ написан
    2 комментария
  • Как сделать пагинацию определенной категории?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вам нельзя использовать query_posts(), это системная функция ядра, вы сломаете основной запрос. Чтобы его поправить используйте хук pre_get_posts

    add_action( 'pre_get_posts', 'set_front_page_category' );
    function set_front_page_category( $query ) {
    	if ( $query->is_front_page() && $query->is_main_query() ) {
    		$query->set( 'cat', '2' );
    	}
    }
    Ответ написан
    5 комментариев
  • Как защитить контент от парсинга с помощью Nginx?

    @rPman
    Основная защита от парсинга - только при доступе к данным по авторизации и установка лимитов на данные (объем, доступный пользователю либо за какой то период времени, например сутки/месяц).

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

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

    Можно поставить 'палки в колеса', сделав этот процесс сложнее (и дороже), в основном это запутывание/шифрование данных, доступных напрямую (по api) с бакэнда и обфускация кода, его преобразования в видимый пользователю контент, чтобы классические (дешевые) инструменты не работали. Как всегда стоимость защиты (затрат на разработку) должна быть сравнима затрат граберов на получение данных (обычно им проще).
    К сожалению вместе с контент-грабером, в заблуждение будут введены роботы поисковых систем, ведь их основная работа - грабить контент.
    spoiler
    * api не должен быть простым и интуитивно понятным, идентификаторы могут вообще не быть постоянными (их можно преобразовывать на бакэнде на основе данных в сессии)
    * код javascipt, например получения ссылки на объект должен быть нетривиальным, т.е. чтобы получить следующую ссылку на требуемый граберу объект, потребовалось бы использовать сам браузер (а не простенький скрипт парсер html)
    * верстка может быть непостоянной, изменяющиеся, простые гуляющие наименования классов и идентификаторов уже могут создать кучу проблем (я такое встречал), а уж постоянное изменение структуры должно совсем запудрить голову даже опытным граберам (не встречал)
    * шрифт может не являться правильным (видимые символы могут не соответствовать их кодам), при этом генерируемый каждый раз новый под конкретную сессию пользователя. Простая подстановка, сильно усложнит (но не сделает невозможной) получение данных через буфер или document.innerText в консоли браузера, оставив граберу только вариант распознавание экрана скринридером (а не тривиальная верстка потребует от пользователя сложную настройку и автоматизацию и эти инструменты)
    * типовые javascript методы браузера должны быть замещены на 'неправильно работающие', чтобы граберу пришлось использовать внешние скрипты а не простой инжект javascript (обычно это сильно упрощает).
    Ответ написан
    3 комментария
  • Как поставить права на папку /var/www?

    Endru9
    @Endru9
    Админ Linux
    Давать файлам права на исполнение потенциально опасно.
    Все директории должны иметь права 775, а файлы 664, поэтому:
    find /var/www/ -type d -exec chmod 755 {} \;
    find /var/www/ -type f -exec chmod 644 {} \;

    иначе привет от shell
    Ответ написан
    2 комментария
  • Как создать текстовое поле с редактированием в админке WORDPRESS?

    Kozack
    @Kozack Куратор тега WordPress
    Thinking about a11y
    Когда-то встречал следующий подход:
    В шаблоне для главной страницы (не важно, что у вас там, статика или последние посты) подгружается и выводится контент другой страницы.

    Для этого вам нужно где-либо добавить параметр для выбора страницы. Именно контент выбранной будет выводится в блоке приветствие.

    Затем, пользователь создаёт какую-то страницу, с любым содержимым используя встроенный в ВП редактор. И в настройках выбирает эту страницу как "Содержимое для блока приветствия".

    Базово это всё. Так владелец сайта может использовать все преимущества ВП: Все возможности редактора, Можно создавать черновики, быстро переключать одно приветствие на другое, будет поддержка мультиязычных плагинов, в блок приветствия можно засунуть любое содержимое, от "Hello World" до контактной формы с слайдером и т.д.
    Ответ написан
    1 комментарий
  • Как исправить ошибку после перехода на php 8?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вордпрессу еще года два на восмерку путь заказан. Как минимум.

    Но вообще специально для таких вот печальных случаев именно в 8-ке придумали
    <?php $cf = get_post_meta($post?->ID, 'n', true);

    Но тогда этот код перестанет работать на всех предыдущих версиях.
    Ответ написан
    3 комментария
  • Не работает форма на openserver WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Обработчик по прямому файловому URL - это дичь. В WordPress для этих задач используются хуки и коллбеки на них.
    Ответ написан
    Комментировать
  • Как внедриить JSON в WordPress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Json это всего лишь формат данных, автобус который возит ваши данные, работать как с обычным объектом / массивом.

    Высаживаете содержимое из автобуса и делаете, что хотите

    $data = file_get_contents( 'https://steampay.com/api/products' );
    	if ( ! empty( $data ) ) {
    		$args = json_decode( $data );
    		
    		foreach ( $args->products as $one_product ) {
    			echo $one_product->title . '<br>';
    		}
    	}
    Ответ написан
  • Wordpress - как изменить ссылку страниц пагинации?

    Kozack
    @Kozack Куратор тега WordPress
    Thinking about a11y
    https://gist.github.com/lauhakari/5089252
    Но, очень не советую делать что-то такое. Это чудесный способ выстрелить себе в ногу.
    Ответ написан
    Комментировать
  • Как показать блок только на главной странице wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    if ( is_home() || is_front_page() ) :
    // тут то, что надо отображать только на главной
    endif;
    Ответ написан
    4 комментария
  • Почему на странице (page) в Wordpress уезжает вправо контент?

    OtshelnikFm
    @OtshelnikFm Куратор тега WordPress
    Обо мне расскажет yawncato.com
    Например div лишний в вёрстке или в записи.
    Больше хрустальный шар не показал
    Ответ написан
    9 комментариев
  • Как добавить ссылку, только для телефонов?

    OtshelnikFm
    @OtshelnikFm Куратор тега WordPress
    Обо мне расскажет yawncato.com
    Медиазапрос и pointer-events
    Ответ написан
    Комментировать