Intereting Posts
Почему наш редактор сообщений застревает в cols = 40? Изменение цвета фона латекса $ латекс в глобальном масштабе Возможность создания страницы / новой страницы пользователя ищет плагин для навигации (аккордеон) Скрытые некоторые настройки в сообщении или странице Локальный WordPress из Git repo, где установить корень документа? Отсутствие сообщений в запросе Сделать первый дочерний элемент связи по умолчанию вместо его родительского Как переименовать ссылку профиля на странице wp-admin Как заставить WP использовать https для доступа к wordpress.org? Получение внутреннего сервера на страницах подпапок Поверните get_posts как строку в массив для использования в параметрах темы admin Как вызвать конечную точку REST при публикации публикации? Параметры выбора SELECT исчезают при сохранении виджета Сайт нуждается в массовом обновлении – как действовать?

Повторить одну категорию как заголовок, когда сообщение имеет несколько категорий?

ОБНОВЛЕННЫЙ ВОПРОС

Вот моя ситуация:

  • В верхней навигации WordPress имеется несколько пунктов меню, которые переходят к массиву сообщений в определенной категории. Например, если вы нажмете «ожерелья», вы окажетесь в разделе ожерелья. Вы можете нажать «Далее» или «Предыдущие» кнопки и перейти к следующему сообщению ожерелья.

  • В верхней части страницы есть тег H2, который отображает заголовок, получая его название категории:

    <?php $category = get_the_category(); echo $category[0]->cat_name; ?> 
  • Проблема в том, что все эти сообщения перечислены в разделе МНОГОКРАТНЫЕ. Вышеприведенный код получает только первую категорию. Если один из них указан в категориях «ожерелья», а также «подвески», он отображает неправильный заголовок в одной из этих категорий.

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

Есть десятки категорий. Все они используют шаблон single.php. Я пытаюсь изменить заголовок на странице шаблона single.php NOT category.php

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

Проблема с реферерами заключается в том, что они устанавливаются и контролируются пользовательской стороной. Источники могут быть отключены или заблокированы (например, пользователи получают доступ к сайту за прокси-сервером). Просто ради интереса, вот очень интересный ответ на вопрос. В каких случаях HTTP-реферер будет пустым, взятым из этого сообщения на SO

Он будет / может быть пустым, когда конечный пользователь

  • введите URL-адрес сайта в адресную строку браузера.
  • посетил сайт с помощью браузера.
  • посетил сайт как первую страницу в окне / вкладке.
  • переключается с URL-адреса https на URL-адрес http.
  • переключился с URL-адреса https на другой URL-адрес https.
  • установлено программное обеспечение безопасности (антивирус / брандмауэр / и т. д.), который удаляет реферер из всех запросов.
  • находится за прокси-сервером, который удаляет реферер из всех запросов.
  • посетил сайт программным способом (например, curl ) без установки заголовка referrer (searchbots!).

Вы бы хотели прочитать другие ответы там, чтобы получить дополнительную информацию

Я сидел с подобной проблемой и искал более надежный способ установки и передачи рефереров, и это привело к этому вопросу и замечательному ответу @gmazzap

Таким образом, ваше решение будет основано на чем-то подобном. Мы добавим специальный параметр в наш URL-адрес, который будет служить в качестве реферера ( я сделал предположение, что ваши сообщения взяты из сборки в post post и taxonomy category )

  • Определите страницы наших категорий и добавьте реферер к ссылкам сообщения через фильтр post_link . Этот реферер будет содержать идентификатор категории. Вы можете использовать название категории, но это может стать довольно грязным в вашем URL-адресе. Все зависит от вас.

     add_filter('post_link', function( $permalink ) // Change to post_type_link for custom post type posts { if ( is_category() // Change to is_tax() for custom taxonomy pages && ( $cat = get_queried_object() ) ) { $permalink = esc_url( add_query_arg( array( 'ref' => $cat->term_id ), $permalink ) ); } return $permalink; }); 

    Это даст вам URL-адрес, подобный приведенному ниже, на одной странице, если вы нажмете ссылку на сообщение на странице категории

     http://example.com/wordpress/post-name?ref=1 
  • У нас должен быть способ прочитать и использовать эту информацию из URL-адреса, чтобы сделать ее полезной. Для этого мы должны добавить запрос arg ref чтобы WordPress мог его прочитать

     add_filter( 'query_vars', function ( $vars ) { $vars[] = 'ref'; return $vars; }); 
  • Все, что вам нужно сделать сейчас, это проверить, был ли один пост указанным сообщением, получить значение из URL-адреса и использовать эту информацию для отображения правильного названия категории ( ПРИМЕЧАНИЕ. Этот фрагмент кода входит в ваш single.php )

     $referrer = filter_input( INPUT_GET, 'ref', FILTER_VALIDATE_INT ); // This validate and checks if our referrer "ref" is set if ( $referrer ) { $category = get_category( $referrer ); echo '<h2>' . $category->name . '</h2>'; } 

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

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

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

РЕДАКТИРОВАТЬ

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

Это означает, что если одна публикация была нажата из category B , и эта должность имеет три категории: category A , category B и category C , следующий и предыдущий соседний пост будут от category B Если вы перейдете на любой столбец, соседний столбец с одного клика по одному сообщению будет также из category B т. Д.

Я прокомментировал код, чтобы вы могли лучше следить за ним, а также настраивать и изменять его по мере необходимости. Просто скопируйте и вставьте этот код в файл плагина и активируйте его. Кроме того, скопируйте код (без заголовка плагина, конечно) и вставьте его как есть в свой файл functions.php ( ПРИМЕЧАНИЕ. Это работает только для сборки в category таксономии и сборки в post post . Вы должны соответствующим образом изменить его потребности в соответствии с типом почты и пользовательской таксономией)

 <?php /* * Plugin Name: Category referred posts * URI: https://wordpress.stackexchange.com/a/192018/31545 * Description: Add referrer links to single posts and pagination if single posts was referred from a category page * Version: 1.0 * Author: Pieter Goosen */ /* * Add our custom query vars so WordPress can read it */ add_filter( 'query_vars', function ( $vars ) { $vars[] = 'ref'; return $vars; }); /* * Add our referrer to single post links if we are on a category page */ add_filter('post_link', function( $permalink ) // Change to post_type_link for custom post type posts { if ( is_category() // Change to is_tax() for custom taxonomy pages && ( $cat = get_queried_object() ) ) { $permalink = esc_url( add_query_arg( ['ref' => $cat->term_id], $permalink ) ); } return $permalink; }); /* * Create our custom adjacent post link */ function get_referred_adjacent_post( $args = [] ) { //First check if we are on a single post, else return false if ( !is_single() ) return false; //Defaults arguments set for the function. $defaults = [ 'previous' => true, 'anchor_text' => '%anchor', 'post_link_text' => '%text', 'span_text_prev' => __( 'Older post: ' ), 'span_text_next' => __( 'Newer post: ' ), ]; $combined_args = wp_parse_args( $args, $defaults ); /** * Get the currently displayed single post. For this use * get_queried_object() as this is more safe than the global $post * * The $post global is very easily changed by any poorly written custom query * or function, and is there for not reliable * * @see Post below on WPSE for explanation * @link https://wordpress.stackexchange.com/q/167706/31545 */ $current_post = get_queried_object(); $current_post_date = $current_post->post_date; $current_post_type = $current_post->post_type; //Set the important parameters to either get the next post or previous post $previous = $combined_args['previous']; $order = ( $previous ) ? 'DESC' : 'ASC'; $op = ( $previous ) ? 'before' : 'after'; // Check if we have a referrer, if so, we need to set this to get the next post in this specific referrer category $cat_id = filter_input( INPUT_GET, 'ref', FILTER_VALIDATE_INT ); if ( $cat_id ) $custom_args = ['cat' => $cat_id]; /** * Set the default arguments to merge with the referrer arguments * * Uses date_query (introduced WordPress 3.7) to calculate the appropriate adjacent post * @see http://codex.wordpress.org/Class_Reference/WP_Query#Date_Parameters */ $query_args = [ 'post_type' => $current_post_type, 'posts_per_page' => 1, 'order' => $order, 'no_found_rows' => true, 'suppress_filters' => true, 'date_query' => [ [ $op => $current_post_date, 'inclusive' => false ] ] ]; $query_args = ( isset( $custom_args ) ) ? wp_parse_args( $custom_args, $query_args ) : $query_args; $q = new WP_Query( $query_args ); //If there are no post found, bail early if( !$q->have_posts() === 0 ) return false; //If there are posts, continue $adjacent_post = $q->posts[0]; //Build the permalinks for the adjacent post $permalink = get_permalink( $adjacent_post->ID ); // Return the correct permalink, we should add our referrer to the link now if this post was referred $link = ( $cat_id ) ? add_query_arg( ['ref' => $cat_id], $permalink ) : $permalink; // Set up out link text to display $span_text = ( $combined_args['previous'] ) ? $combined_args['span_text_prev'] : $combined_args['span_text_next']; $span = '<span class="meta-nav">' . $span_text . '</span>'; // Create our anchor and post title text. By default. The post title is used $anchor_text = ( $combined_args['anchor_text'] == '%anchor' ) ? $adjacent_post->post_title : $combined_args['anchor_text']; $post_title = ( $combined_args['post_link_text'] == '%text' ) ? $adjacent_post->post_title : $combined_args['post_link_text']; //Create the link with title name and anchor text $adjacent_post_link = $span . '<a href="' . $link . '" title="' . $anchor_text . '">' . $post_title . '</a>'; return $adjacent_post_link; } // Create the next post link - Return the post link function get_next_adjacent_post_link( $anchor_text = '%anchor', $post_link_text = '%text', $span_text_next = 'Newer post: ' ) { $args = [ 'previous' => false, 'anchor_text' => $anchor_text, 'post_link_text' => $post_link_text, 'span_text_next' => $span_text_next, ]; return get_referred_adjacent_post( $args ); } // Create the previous post link - Return the post link function get_previos_adjacent_post_link( $anchor_text = '%anchor', $post_link_text = '%text', $span_text_prev = 'Older post: ' ) { $args = [ 'previous' => true, 'anchor_text' => $anchor_text, 'post_link_text' => $post_link_text, 'span_text_prev' => $span_text_prev, ]; return get_referred_adjacent_post( $args ); } // Create the next post link - Echo post link function next_adjacent_post_link( $anchor_text = '%anchor', $post_link_text = '%text', $span_text_next = 'Newer post: ' ) { echo get_next_adjacent_post_link( $anchor_text, $post_link_text, $span_text_next ); } // Create the previous post link - Echo post link function previos_adjacent_post_link( $anchor_text = '%anchor', $post_link_text = '%text', $span_text_prev = 'Older post: ' ) { echo get_previos_adjacent_post_link( $anchor_text, $post_link_text, $span_text_prev ); } 

Теперь вы должны добавить следующее в свой файл single.php:

  • Чтобы отобразить собственный текст

     $referrer = filter_input( INPUT_GET, 'ref', FILTER_VALIDATE_INT ); // This validate and checks if our referrer "ref" is set if ( $referrer ) { $category = get_category( $referrer ); echo '<h2>' . $category->name . '</h2>'; } 
  • Чтобы отобразить ваши сообщения

     if ( function_exists( 'next_adjacent_post_link' ) ) next_adjacent_post_link(); if ( function_exists( 'previos_adjacent_post_link' ) ) previos_adjacent_post_link(); 

    Просто добавьте соответствующую метку в свои ссылки. Также проверьте принятые аргументы, чтобы настроить текст отображения ссылок.

Это должно заложить основу для вас. Вы должны быть в состоянии настроить это в соответствии с вашими точными потребностями

Каков самый простой способ выплескивать одну категорию как заголовок в теге H2 для сообщения с несколькими категориями?

 $c = get_the_category(); if (!empty($c[0])) { echo $c[0]->name; } 

Я понятия не имею, как и почему в нее вступают сессии.

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

FYI: Я расширил код van Pieter Goosen, чтобы включить теги. Я также исправил что-то, показывающее следующие и предыдущие ссылки в конце строки на сообщения, которых там не было. И я решил отделить обычный материал next-prev-post от следующего pref-материала из этого кода в single.php. То, что я не получал, чтобы работать, использовал menu_order как сортировку – так как у меня есть заказ на заказ – хорошо.

Это теперь в моих functions.php:

 /* * Add our custom query vars so WordPress can read it */ add_filter( 'query_vars', function ( $vars ) { array_push($vars, "ref", "thetype"); return $vars; }); /* * Add our referrer to single post links if we are on a category page */ add_filter('post_link', function( $permalink ) // Change to post_type_link for custom post type posts { if ( is_category() // Change to is_tax() for custom taxonomy pages && ( $cat = get_queried_object() ) ) { $permalink = esc_url( add_query_arg( ['ref' => $cat->term_id], $permalink ) ); $permalink = esc_url( add_query_arg( ['thetype' => 'category'], $permalink ) ); } if ( is_tag() // Change to is_tax() for custom taxonomy pages && ( $cat = get_queried_object() ) ) { $permalink = esc_url( add_query_arg( ['ref' => $cat->term_id], $permalink ) ); $permalink = esc_url( add_query_arg( ['thetype' => 'tag'], $permalink ) ); } return $permalink; }); /* * Create our custom adjacent post link */ function get_referred_adjacent_post( $args = [] ) { //First check if we are on a single post, else return false if ( !is_single() ) return false; //Defaults arguments set for the function. $defaults = [ 'previous' => true, 'anchor_text' => '%anchor', 'post_link_text' => '%text', 'span_text_prev' => __( 'Older post: ' ), 'span_text_next' => __( 'Newer post: ' ), ]; $combined_args = wp_parse_args( $args, $defaults ); /** * Get the currently displayed single post. For this use * get_queried_object() as this is more safe than the global $post * * The $post global is very easily changed by any poorly written custom query * or function, and is there for not reliable * * @see Post below on WPSE for explanation * @link https://wordpress.stackexchange.com/q/167706/31545 */ $current_post = get_queried_object(); $current_post_date = $current_post->post_date; $current_post_type = $current_post->post_type; $current_post_ID = $current_post->ID; //Set the important parameters to either get the next post or previous post $previous = $combined_args['previous']; $order = ( $previous ) ? 'DESC' : 'ASC'; $op = ( $previous ) ? 'before' : 'after'; $css_class = $combined_args['css_class']; // Check if we have a referrer, if so, we need to set this to get the next post in this specific referrer category $mytype = filter_input( INPUT_GET, 'thetype'); if ($mytype == 'category') { $cat_id = filter_input( INPUT_GET, 'ref', FILTER_VALIDATE_INT ); if ( $cat_id ) $custom_args = ['cat' => $cat_id]; } else { $cat_id = filter_input( INPUT_GET, 'ref', FILTER_VALIDATE_INT ); if ( $cat_id ) $custom_args = ['tag_id' => $cat_id]; } /** * Set the default arguments to merge with the referrer arguments * * Uses date_query (introduced WordPress 3.7) to calculate the appropriate adjacent post * @see http://codex.wordpress.org/Class_Reference/WP_Query#Date_Parameters */ $query_args = [ 'post_type' => $current_post_type, 'posts_per_page' => 1, 'order' => $order, 'no_found_rows' => true, 'suppress_filters' => true, 'date_query' => [ [ $op => $current_post_date, 'inclusive' => false ] ] ]; $query_args = ( isset( $custom_args ) ) ? wp_parse_args( $custom_args, $query_args ) : $query_args; $q = new WP_Query( $query_args ); //If there are no post found, bail early if( !$q->have_posts() === 0 ) return false; //If there are posts, continue $adjacent_post = $q->posts[0]; if( empty($adjacent_post->ID) ) return false; //Build the permalinks for the adjacent post $permalink = get_permalink( $adjacent_post->ID ); // Return the correct permalink, we should add our referrer to the link now if this post was referred $link = ( $cat_id ) ? add_query_arg( ['ref' => $cat_id, 'thetype' => $mytype], $permalink ) : $permalink; // Set up out link text to display $span_text = ( $combined_args['previous'] ) ? $combined_args['span_text_prev'] : $combined_args['span_text_next']; $span = '<span class="meta-nav">' . $span_text . '</span>'; // Create our anchor and post title text. By default. The post title is used $anchor_text = ( $combined_args['anchor_text'] == '%anchor' ) ? $adjacent_post->post_title : $combined_args['anchor_text']; $post_title = ( $combined_args['post_link_text'] == '%text' ) ? $adjacent_post->post_title : $combined_args['post_link_text']; //Create the link with title name and anchor text $adjacent_post_link = $span . '<a href="' . $link . '" class="' . $css_class . '" title="' . $anchor_text . '">' . $post_title . '</a>'; return $adjacent_post_link; } // Create the next post link - Return the post link function get_next_adjacent_post_link( $anchor_text = '%anchor', $post_link_text = '%text', $span_text_next = 'Newer post: ' ) { $args = [ 'previous' => false, 'anchor_text' => $anchor_text, 'post_link_text' => $post_link_text, 'span_text_next' => $span_text_next, 'css_class' => "post-nav-next", ]; return get_referred_adjacent_post( $args ); } // Create the previous post link - Return the post link function get_previos_adjacent_post_link( $anchor_text = '%anchor', $post_link_text = '%text', $span_text_prev = 'Older post: ' ) { $args = [ 'previous' => true, 'anchor_text' => $anchor_text, 'post_link_text' => $post_link_text, 'span_text_prev' => $span_text_prev, 'css_class' => "post-nav-prev", ]; return get_referred_adjacent_post( $args ); } // Create the next post link - Echo post link function next_adjacent_post_link( $anchor_text = '%anchor', $post_link_text = '%text', $span_text_next = 'Next post ' ) { echo get_next_adjacent_post_link( $anchor_text, $post_link_text, $span_text_next ); } // Create the previous post link - Echo post link function previos_adjacent_post_link( $anchor_text = '%anchor', $post_link_text = '%text', $span_text_prev = 'Previous post ' ) { echo get_previos_adjacent_post_link( $anchor_text, $post_link_text, $span_text_prev ); } 

Из single.php:

 <?php $referrer = filter_input( INPUT_GET, 'ref', FILTER_VALIDATE_INT );?> <!-- // checks if our referrer "ref" is set --> <?php if ( $referrer ): ?> if ( function_exists( 'next_adjacent_post_link' ) ) next_adjacent_post_link(); if ( function_exists( 'previos_adjacent_post_link' ) ) previos_adjacent_post_link(); <?php else: ?> <!--else referer --> <!--normal prev next links here --> <?php endif; ?> <!-- end if refferer -->