Echo eine Kategorie als Titel, wenn Post mehrere Kategorien hat?

AKTUALISIERTE FRAGE, um klarer zu sein

Hier ist meine Situation:

  • WordPress Top Navigation hat mehrere Menüpunkte, die zu einer Reihe von Posts innerhalb einer bestimmten Kategorie springen. Wenn Sie zum Beispiel auf “Halsketten” klicken, befinden Sie sich im Bereich Halsketten. Sie können auf “next” oder “previous” klicken und zur nächsten Halskette gehen.

  • Oben auf der Seite befindet sich ein H2-Tag, der den Titel anzeigt, indem der Kategoriename abgerufen wird:

    cat_name; ?> 
  • Das Problem ist, dass alle diese Beiträge in mehreren Kategorien aufgeführt sind. Der obige Code erhält nur die erste Kategorie. Wenn ein Beitrag unter den Kategorien “Halsketten” und “Anhänger” aufgeführt wird, wird der falsche Titel in einer dieser Kategorien angezeigt.

Also muss der Titel die richtige Kategorie entsprechend der aktuellen Kategorie anzeigen, in der sich der Benutzer gerade befindet. Momentan, wenn Sie auf “next” oder “previous” klicken, ändert sich der Titel zufällig, abhängig davon, welche Kategorie als erste für den jeweiligen Beitrag gelistet ist.

Es gibt Dutzende von Kategorien. Sie teilen alle die single.php Vorlage. Ich versuche den Titel auf der single.php Template-Seite NOT category.php zu ändern

Solutions Collecting From Web of "Echo eine Kategorie als Titel, wenn Post mehrere Kategorien hat?"

Damit dies funktioniert, müssen Sie wissen, woher der einzelne Beitrag stammt und ob der Referrer gültig ist. Zweitens müssen wir die Paginierung zwischen einzelnen Posts anpassen, damit wir unseren Referrer zwischen den einzelnen Posts weitergeben können.

Das Problem mit den Referrern besteht darin, dass sie von der Benutzerseite eingestellt und kontrolliert werden. Referrer können deaktiviert oder blockiert werden (wie Benutzer, die auf eine Site hinter einem Proxy zugreifen). Nur um des Interesses willen, hier ist eine sehr interessante Antwort auf die Frage In welchen Fällen wird der http-Referrer von diesem Beitrag auf SO leer sein

Es wird / kann leer sein, wenn der Endbenutzer

  • Die URL der Website wurde in die Adressleiste des Browsers eingegeben.
  • besuchte die Site mit einem vom Browser gepflegten Lesezeichen.
  • besuchte die Seite als erste Seite im Fenster / Tab.
  • Von einer https-URL zu einer http-URL gewechselt.
  • Von einer https-URL zu einer anderen https-URL gewechselt.
  • hat eine Sicherheitssoftware installiert (Antivirus / Firewall / etc), die den Referrer von allen Anfragen entfernt.
  • steht hinter einem Proxy, der den Referrer von allen Anfragen streift.
  • habe die Seite programmatisch (wie curl ) besucht, ohne den Referrer-Header zu setzen (searchbots!).

Sie würden auch die anderen Antworten dort für zusätzliche Einsicht lesen wollen

Ich saß mit ähnlichen Problemen und suchte nach einer zuverlässigeren Möglichkeit, Referrer zu setzen und weiterzugeben, und dies führte zu dieser Frage und einer wunderbaren Antwort von @gmazzap

Ihre Lösung würde also auf etwas Ähnlichem basieren. Wir werden unserer URL einen speziellen Parameter hinzufügen, der als Referrer dienen wird ( ich habe die Annahme gemacht, dass Ihre Posts aus der Post- post und Taxonomie- category )

  • Identifizieren Sie unsere Kategorienseiten und fügen Sie über den post_link Filter einen post_link den post_link . Dieser Referrer enthält die Kategorie-ID. Sie können den Kategorienamen verwenden, aber das kann in Ihrer URL sehr unordentlich werden. Die Wahl liegt ganz bei Ihnen.

     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; }); 

    Dadurch erhalten Sie eine URL wie die folgende auf Ihrer einzelnen Post-Seite, wenn Sie auf einen Post-Link auf der Kategorieseite klicken

     http://example.com/wordpress/post-name?ref=1 
  • Wir müssen eine Möglichkeit haben, diese Informationen aus der URL zu lesen und zu verwenden, um sie nützlich zu machen. Dafür müssen wir eine Abfrage arg ref hinzufügen, damit WordPress sie lesen kann

     add_filter( 'query_vars', function ( $vars ) { $vars[] = 'ref'; return $vars; }); 
  • Alles, was Sie jetzt tun müssen, ist zu überprüfen, ob der einzelne Post ein referierter Post war, erhalten Sie den Wert von der URL und verwenden Sie diese Information, um den korrekten Kategorienamen anzuzeigen ( HINWEIS: Dieser Codeabschnitt geht in Ihre 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 '

    ' . $category->name . '

    '; }

Das obige ist nur ein grober Entwurf dessen, was Sie tun können, um dies zu erreichen, es gibt Ihnen nur eine Grundlage, von der aus Sie arbeiten können. Sie können es nach Bedarf anpassen und ändern.

Auf Ihren einzelnen Seiten müssen Sie auch Ihren Referrer erhalten und diesen an Ihre nächsten und vorherigen Postlinks weiterleiten, um diese function zwischen Beiträgen zu erhalten. Ich habe eine Antwort auf die Paginierung basierend darauf geschrieben, es ist jedoch recht sperrig und kann etwas aufräumen. Es gibt einige Teile, die ich jetzt hier behandelt habe, und es gibt auch Teile, die Sie wahrscheinlich nie brauchen werden, die Sie einfach entfernen können. Sie können es bearbeiten und nach Bedarf anpassen und anpassen.

Ich bin damit beschäftigt, die komplette Paginierungsfunktion (mit besserer und sauberer PHP-functionalität) mit einigen zusätzlichen functionen neu zu schreiben, die classn sind fertig, es sind nur die letzten Teile, die alles in funktionale functionen bringen, was mir einen Albtraum gibt, und um ehrlich zu sein, ich Ich bin seit geraumer Zeit nicht mehr am Projekt, da ich nachts wirklich nicht viel Zeit habe. Wann es fertig sein wird, ist noch ein Mysterium. Aber die Idee und der Code von dem, was ich in dieser spezifischen Antwort gegeben habe, sollten den Trick für dich tun. Sie können meine Antwort und Referrer Paginierung function hier überprüfen

BEARBEITEN

Ich habe schnell ein kleines Plugin geschrieben, das den Referrer und die neuen Paginierungslinks enthält, um den Referrer über mehrere einzelne Posts zu transportieren. Diese Paginierungslinks werden auch zwischen einzelnen Posts des Referrers wechseln

Das heißt, wenn ein einzelner Beitrag aus category B angeklickt wurde und dieser Beitrag drei Kategorien hat, category A , category B und category C , wird der nächste und der vorherige angrenzende Beitrag aus category B . Wenn du zu einer der beiden Posts gehst, wird der angrenzende Post von diesem angeklickten Post auch aus der category B

Ich habe den Code kommentiert, so dass Sie in der Lage sein sollten, ihn besser zu verfolgen und ihn nach Bedarf anzupassen und zu modifizieren. Kopieren Sie einfach diesen Code in eine Plugin-Datei und aktivieren Sie ihn. Alternativ kopieren Sie den Code (natürlich ohne den Header des Plugins) und fügen ihn wie gehabt in Ihre functions.php ( HINWEIS: Dies funktioniert nur für die Build-in-Taxonomie- category und den Build-Post- post . Sie sollten ihn entsprechend ändern benötigt nach Post-Typ und benutzerdefinierter Taxonomie)

 < ?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_text . ''; // 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 . '' . $post_title . ''; 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 ); } 

Sie sollten jetzt folgendes in Ihrer single.php hinzufügen:

  • Um Ihren benutzerdefinierten Text anzuzeigen

     $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 '

    ' . $category->name . '

    '; }
  • Um Ihre Postlinks anzuzeigen

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

    Fügen Sie einfach Ihre relevanten Markierungen zu Ihren Links hinzu. Überprüfen Sie auch die akzeptierten Argumente, um den Text anzupassen, den die Links anzeigen.

Dies sollte den Grundstein dafür legen, dass Sie sich auf den Weg machen. Sie sollten in der Lage sein, dies an Ihre genauen Bedürfnisse anzupassen

Was ist der einfachste Weg, eine einzelne Kategorie als Titel in einem H2-Tag für einen Post mit mehreren Kategorien auszuspucken?

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

Ich habe keine Ahnung, wie oder warum Sitzungen dazu kommen würden.

Ich habe nach zwei Tagen gesucht, bevor ich das gefunden habe, warum dies nicht Standard-Verhalten in WP ist, über mich hinaus. Das einzige, was ich gefunden habe, waren Plugins, die nicht mehr funktionierten, und Code, der nicht berücksichtigte, dass es hierarchische Kategorien gibt und dass mehrere Tags und Kategorien an einen Post angehängt sein könnten.

Zu Ihrer Information: Ich habe den Code van Pieter Goosen erweitert, um auch die Tags einzufügen. Ich korrigierte auch etwas, das das Anzeigen von nächsten und vorherigen Links am Ende der Zeile zu Posts zeigte, die nicht dort waren. Und ich habe beschlossen, die normalen next-prev-post-Sachen von den next-pref-Sachen aus diesem Code in single.php zu trennen. Die Sache, die ich nicht zur Arbeit bringen konnte, war menu_order als Sortierung zu verwenden – da ich eine benutzerdefinierte Nachbestellung habe – ach ja.

Dies ist jetzt in meiner 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_text . ''; // 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 . '' . $post_title . ''; 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 ); } 

Aus der single.php:

 < ?php $referrer = filter_input( INPUT_GET, 'ref', FILTER_VALIDATE_INT );?>  < ?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: ?>   < ?php endif; ?>