Wie kann ich HTTP-Header nur zu Posts einer bestimmten Kategorie von einem Plugin ändern?

Ich habe ein Plugin für das Einfügen zusätzlicher HTTP-Header. Es funktioniert gut mit dem folgenden CODE:

add_action( 'send_headers', 'jim_stop' ); function jim_stop() { header( 'Cache-Control: no-store, no-cache, must-revalidate, max-age=0' ); header( 'Pragma: no-cache' ); header( 'Expires: Thu, 01 Dec 1994 16:00:00 GMT' ); } 

Es setzt die obigen HTTP-Header auf alle Posts. Ich möchte jedoch die Header nur auf die Seiten einer bestimmten Kategorie injizieren. Angenommen, die Kategorie slug ist x und id ist 75 .

Um die HTTP-Header für die Posts der Kategorie x in_category( 'x' ) , habe ich in_category( 'x' ) bedingte wie folgt verwendet:

 add_action( 'send_headers', 'jim_stop' ); function jim_stop() { if ( in_category( 'x' ) ) { // category specific HTTP headers } } 

aber das hat nicht funktioniert.

Ich habe auch versucht, die Kategorie so zu überprüfen:

 $cat = get_query_var( 'cat' ); if ( $cat == '75' ) { // category specific HTTP headers } 

und auch so:

 global $post; if ( in_category ( 'x', $post->ID ) ) { // category specific HTTP headers } 

aber diese scheitern auch.

Da die Kategorieüberprüfung nicht mit dem send_headers Hook send_headers , habe ich versucht, dies mit dem wp_headers Filter-Hook von wp_headers zu tun, wie folgt:

 add_filter( 'wp_headers', 'add_header_xua' ); function add_header_xua( $headers ) { if ( in_category( 'x' ) ) { // category specific HTTP header changes } return $headers; } 

aber es scheitert auch. Also meine Frage ist:

  • Wie kann ich die HTTP-Header-Änderungen nur auf die Beiträge einer bestimmten Kategorie beschränken?

Solutions Collecting From Web of "Wie kann ich HTTP-Header nur zu Posts einer bestimmten Kategorie von einem Plugin ändern?"

Warum es nicht funktioniert:

send_headers Hook wird ausgetriggers, sobald die HTTP Header für Caching, Inhalt usw. gesendet wurden, aber bevor die Hauptabfrage richtig initiiert wurde. Aus diesem Grund funktioniert die function in_category() nicht, wenn Sie sie in diesem Aktions-Hook verwenden. wp_headers gilt für den Filter-Hook wp_headers .

Damit es funktioniert:

  1. Sie können den template_redirect (oder sogar den wp ) verwenden. Dieser Hook wird ausgetriggers, nachdem die mit der databaseabfrage verbundenen Objekte ordnungsgemäß initiiert wurden, jedoch bevor eine Ausgabe generiert wird. Dieser Hook eignet sich also gut zum Setzen zusätzlicher HTTP-Header, Umleiten zu einer anderen URL usw.

  2. Außerdem müssen Sie is_single() überprüfen, da Sie es nur auf die Beiträge dieser Kategorie anwenden möchten. Ansonsten gilt es auch für die Archivseite der Kategorie.

Der Arbeitscode wird also wie folgt aussehen:

 add_action( 'template_redirect', 'jim_stop' ); function jim_stop() { if( is_single() && in_category( 'x' ) ) { header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); header('Pragma: no-cache'); header('Expires: Thu, 01 Dec 1990 16:00:00 GMT'); } } 

Jetzt wird die Kategorieüberprüfung funktionieren und diese zusätzlichen HTTP-Header werden nur für die Posts von Kategorie x .