• Как в WordPress получить список категорий со свежими записями в них?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Задача не сама простая, как может показаться на первый взгляд. Дело в том, что мы не знаем заранее сколько нужно заказать постов из базы, которые будут иметь 5 уникальных рубрик. Мы можем заказать все посты и остановить цикл пока не наберем нужные 5, но на больших объемах данных это создаст излишнюю нагрузку

    Я бы пошел таким путем: на хуке save_post мы можно добавлять свежие термины записи в начало массива с помощью array_unshift()

    add_action( 'save_post', 'update_fresh_terms' );
    if ( ! function_exists( 'update_fresh_terms' ) ) {
    	function update_fresh_terms( $post_id ) {
    
    		if ( $_POST['post_type'] === 'post' ) {
    			$fresh_terms = get_option( '_fresh_category', array() );
    
    			// Получаем термины текущего поста.
    			$terms = get_the_terms( $post_id, 'category' );
    
    			if ( is_array( $terms ) ) {
    				foreach ( $terms as $key => $term ) {
    					array_unshift( $fresh_terms, $term->term_id ); // Добавляем id новых терминов в начало массива.
    				}
    			}
    
    			$fresh_terms = array_unique( $fresh_terms );
    
    			update_option( '_fresh_category', $fresh_terms );
    		}
    	}
    }


    Получить термины для использования можно с помощью нативной get_option(). Или же можно создать дополнительную функцию, которая при первом использовании, когда массив с терминами еще пустой, будет делать запрос всех постов из базы и собирать массив терминов по «свежести»

    if ( ! function_exists( 'get_fresh_terms' ) ) {
    	function get_fresh_terms( $count = 5, $post_type = 'post', $term_name = 'category' ) {
    
    		$fresh_terms = get_option( '_fresh_' . $term_name, array() );
    
    		if ( empty( $fresh_terms ) ) {
    
    			// Задаем нужные нам критерии выборки данных из БД.
    			$args = array(
    				'posts_per_page' => -1,
    				'post_type'      => $post_type,
    			);
    
    			$posts = get_posts( $args );
    
    			foreach ( $posts as $key => $post ) {
    
    				// Получаем термины текущего поста.
    				$terms = get_the_terms( $post->ID, $term_name );
    
    				if ( is_array( $terms ) ) {
    					foreach ( $terms as $key => $term ) {
    						$fresh_terms[] = $term->term_id;
    					}
    				}
    			}
    
    			$fresh_terms = array_unique( $fresh_terms );
    		}
    
    		// Если запрос не дал ни одной категории, возвращаем false.
    		if ( empty( $fresh_terms ) ) {
    			return false;
    		} else {
    			update_option( '_fresh_' . $term_name, $fresh_terms );
    		}
    
    		return $fresh_terms;
    	}
    }
    Ответ написан
    1 комментарий
  • Как запретить wi-fi пользователям доступ в локальную сеть?

    Нужно понимать, что у вас за устройство на другом конце eth0 - оно умеет VLANы?
    Если нет, то простейшим способом будет через iptables запретить доступ подсети wlan0 к ip адресам локальной сети, кроме интернет-шлюза (плохое решение, но сработает). И не отрежте самому себе доступ к RaspberyPi :)
    Ответ написан
    2 комментария
  • Как подключить два роутера, используя один кабель LAN?

    Spetros
    @Spetros
    IT-шник
    Ставите на входе промежуточный роутер и с него на два других разводите.
    Ответ написан
    3 комментария
  • Как закрыть сайт на MediaWiki, даже на чтение?

    UksusoFF
    @UksusoFF
    Можно
    https://www.mediawiki.org/wiki/User_rights#List_of...

    Или через htaccess если это на апаче
    Ответ написан
    Комментировать