web-dev-qa-db-fra.com

Comment puis-je afficher uniquement le dernier message sur ma page d'accueil tout en maintenant les points d'ancrage corrects?

Ce que j'essaie de faire, c'est d'afficher le message le plus récent (comme "single.php" de mon thème) sur ma page d'accueil.

Cela est compliqué par le fait que certains plug-ins (en particulier Scripts n Styles) relient wp_head et wp_enqueue_scripts. Dans ces hooks, ils vérifient is_singular () pour voir si mon javascript par publication devrait être injecté dans la page ou non. Ils vérifient ensuite les attributs de la variable globale $ post pour déterminer les scripts à injecter. Je veux que le javascript per-post soit correctement injecté sur la page d'accueil si nécessaire.

Pour référence, le plugin dans le code source de la question est ici et la fonction spécifique que je m'occupe de faire fonctionner correctement s'appelle scripts_in_head():

static function scripts_in_head() {
    // Global
    $options = get_option( 'SnS_options' );
    if ( ! empty( $options ) && ! empty( $options[ 'scripts_in_head' ] ) ) {
        ?><script type="text/javascript" id="sns_global_scripts_in_head"><?php
        echo $options[ 'scripts_in_head' ];
        ?></script><?php
    }

    if ( ! is_singular() ) return;
    // Individual
    global $post;
    $SnS = get_post_meta( $post->ID, '_SnS', true );
    $scripts = isset( $SnS['scripts'] ) ? $SnS[ 'scripts' ]: array();
    if ( ! empty( $scripts ) && ! empty( $scripts[ 'scripts_in_head' ] ) ) {
        ?><script type="text/javascript" id="sns_scripts_in_head"><?php
        echo $scripts[ 'scripts_in_head' ];
        ?></script><?php
    }
}

Le développement de Wordpress étant relativement nouveau pour moi, j'ai probablement commis une erreur critique qui rend ma vie trop difficile. Voici les différentes manières dont j'ai frappé ma tête contre le mur:

D'après ce que j'ai compris, je ne peux pas changer simplement mon modèle home.php, car le modèle n'est même pas exécuté avant que tous ces hooks se soient déjà exécutés. Par conséquent, modifier la requête à ce stade ou en créer une nouvelle serait inutile.

Je pourrais utiliser une redirection d'en-tête HTTP, bien que je ne sois pas sûre que cela fonctionnerait sans une mise à jour manuelle de la redirection à chaque modification de la dernière publication.

Je pourrais changer home.php pour avoir une redirection javascript, mais il semble que ce serait beaucoup de temps et d’efforts perdus pour charger la page d’accueil "morte" juste pour être redirigé vers une autre page. Si c'est le seul moyen, ainsi soit-il, mais il me semble que je devrais être capable de faire mieux.

J'ai essayé de créer un plugin qui se connecte plus tôt que Scripts n Styles et modifie $ wp_query, mais cela ne semble pas fonctionner correctement. Probablement, je me trompe:

function make_single_from_home()
    global $wp_query;
    if ( $wp_query->is_home() ) {
        $last = wp_get_recent_posts( '1');
        $last_id = $last['0']['ID'];
        $wp_query->set( 'p', $last_id )
        $wp_query->set( 'post_count', 1);
        $wp_query->set( 'is_home', false);
        $wp_query->set( 'is_single', true);
    }
}

J'ai essayé d'associer cela à plusieurs événements avant le hook Scripts n Styles (send_header, template_redirect, etc.), et cela ne semble pas aider. Je ne vois pas les blocs javascript ajoutés à ma balise <head>. (Il est possible que ce soit une solution valide et que moi ou le plugin faisons juste ce que je fais mal)

Il est également possible qu'il existe un moyen très simple de faire de ma page d'accueil une page singulière affichant mon dernier message, et je suis trop nouvelle pour le comprendre.

Existe-t-il un moyen de créer une page d'accueil qui affiche uniquement le dernier message, en rendant la variable $post valide, et is_singular() == true suffisamment tôt pour mes dépendances de plug-in?

1
agent86

La réponse de Chip m'a aidé à corriger l'erreur, mais il a fallu un peu plus de peaufinage pour la résoudre complètement.

Avec une page de garde statique, le modèle front-page.php sera appelé (conformément à la hiérarchie ) et $wp_query sera rempli avec l’ID de page correspondant à la page que vous avez consultée. choisi pour afficher comme "page statique" dans les options de lecture.

Puce a suggéré de créer une nouvelle requête après l'appel get_header(), ce qui peut aider à modifier les publications affichées. Il a également raison de dire que, grâce aux paramètres analysés dans $wp_query dans le modèle front-page.php, l'appel is_singular() renverra TRUE.

Cependant, cela ne résoudra pas le problème de la valeur de $post. Dès que get_header() est appelé, la plupart des thèmes font avancer la chaîne d’action de template_redirect après wp_enqueue_scripts. Tous les crochets situés entre les deux seront appelés et il sera trop tard pour affecter la valeur de $wp_query ou $post aux plug-ins qui relient l'un des événements de cette région.

Par conséquent, l'action wp_head était appelée avec les informations $post de l'entrée "page statique". Puisque je ne veux pas que cela se produise, je dois modifier ces valeurs d'une manière ou d'une autre avant l'appel de get_header().

Il y a probablement plusieurs façons de le faire, mais celle qui a fonctionné pour moi a été d'ajouter:

global $wp_query;

$last = wp_get_recent_posts(array('numberposts'=>'1','post_status'=>'publish' ));
$last_id = $last['0']['ID'];

$wp_query = new WP_Query('p='.$last_id);

à mon front-page.php avant l'appel à get_header(). Cela remplace la valeur de la requête générée à partir de la page statique et la remplace par une valeur renvoyant uniquement la publication la plus récente.

Il est probablement possible de faire cela avec un plugin également, à condition que vous vous connectiez suffisamment tôt.

0
agent86

Je ne suis pas sûr de l'impact des points d'ancrage de plug-ins sur la solution à votre problème. Le fichier modèle home.php est inclus dans l'action template_redirect, qui se déclenche bien avant le wp_head.

Cela dit, ce que vous semblez vouloir faire est:

  1. Avoir 'posts_per_page' = 1 sur la première page de l'index des articles de blog
  2. Avoir 'posts_per_page' = 10 sur les pages suivantes de l'index des articles de blog

La méthode la plus simple consiste probablement à utiliser une page statique comme page de couverture du site, puis à utiliser une requête personnalisée dans front-page.php pour récupérer le dernier message.

front-page.php:

get_header();

$latest_post_args = array(
    'post_per_page' = 1;
);

$latest_post = new WP_Query( $latest_post_args );

if ( $latest_post->have_posts() ) : while ( $latest_post->have-posts() ) : $latest_post->the_post();

    // Loop markup goes here

endwhile; endif;

wp_reset_postdata();

get_footer();

Étant donné que is_singular() renvoie true pour les pages statiques en tant que page de couverture du site, les files de script de plug-in ne doivent pas être affectées.

1
Chip Bennett

Vous tentez d'afficher un extrait de code JavaScript sur la page d'accueil, qui ne comporte qu'un seul article.

La méthode la plus simple consiste à inclure l'extrait de JS partout (Paramètres généraux), puis à vérifier dans le JavaScipt si vous vous trouvez sur la page d'accueil: if ( $('body').hasClass('home') ) { /* do_stuff() */ }

Cela simplifiera la maintenance du code.

(Désolé je n'ai jamais vu cela jusqu'à maintenant.)

0
WraithKenny