web-dev-qa-db-fra.com

Comment puis-je changer les en-têtes HTTP uniquement en messages d'une catégorie spécifique à partir d'un plugin

J'ai un plugin pour injecter des en-têtes HTTP supplémentaires. Cela fonctionne bien avec le code suivant:

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

}

Il définit les en-têtes HTTP ci-dessus sur tous les messages. Cependant, je souhaite injecter les en-têtes uniquement dans les pages d'une catégorie spécifique. Par exemple, supposons que la catégorie slug est x et que id est 75.

Pour définir les en-têtes HTTP spécifiques aux publications de la catégorie x, j'ai utilisé in_category( 'x' ) en conditionnel comme suit:

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

mais ça n'a pas marché.

J'ai aussi essayé de vérifier la catégorie comme ceci:

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

et aussi comme ça:

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

mais ceux-ci échouent aussi.

Comme la vérification de catégorie ne fonctionnait pas avec le hook d'action send_headers, j'ai essayé de le faire avec le hook de filtre wp_headers, comme suit:

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

mais cela échoue aussi. Donc ma question est:

  • Comment puis-je limiter les modifications d'en-tête HTTP aux publications d'une catégorie spécifique?
3
Jim Duggan

Pourquoi ça ne marche pas:

Le hook send_headers est lancé une fois que les en-têtes HTTP pour la mise en cache, le contenu, etc. ont été envoyés, mais avant que la requête principale ne soit correctement lancée. C'est pourquoi la fonction in_category() ne fonctionne pas lorsque vous l'utilisez dans ce crochet d'action. Il en va de même pour le crochet de filtre wp_headers.

Pour que cela fonctionne:

  1. Vous pouvez utiliser le hook template_redirect action (ou même le hook action wp). Ce raccordement est activé une fois que les objets liés à la requête de la base de données principale ont été lancés correctement, mais avant que toute sortie soit générée. Ce hook est donc utile pour définir des en-têtes HTTP supplémentaires, rediriger vers une autre URL, etc.

  2. Vous devez également cocher is_single() car vous souhaitez l'appliquer uniquement aux publications de cette catégorie. Sinon, cela s'appliquera également à la page d'archivage des catégories.

Ainsi, le code de travail sera comme suit:

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

Maintenant, la vérification de la catégorie fonctionnera et ces en-têtes HTTP supplémentaires ne s'appliqueront qu'aux publications de la catégorie x.

4
Fayaz