web-dev-qa-db-fra.com

Comment activer le prélecture HTML5 sur cette page?

Exemple de site: http://www.ianstuart-bride.com

J'ai actuellement ce morceau de code dans header.php, mais cela ne fonctionne pas comme souhaité:

<?php if (is_archive() && ($paged > 1) && ($paged < $wp_query->max_num_pages)) { ?>
    <link rel="prefetch" href="<?php echo get_next_posts_page_link(); ?>">
    <link rel="prerender" href="<?php echo get_next_posts_page_link(); ?>">
<?php } elseif (is_singular()) { ?>
    <link rel="prefetch" href="<?php bloginfo('home'); ?>">
    <link rel="prerender" href="<?php bloginfo('home'); ?>">
<?php } ?>

Le prefetch de la page d'accueil pointe vers une page inexistante. Je voudrais désactiver le préchargement sur la page d'accueil.

Je veux activer le prefetching sur ces pages , pour la robe 'Next'.

Ceci est le code pour les pages de tenue simple.

J'ai essayé ceci, mais cela a lié à la page en cours au lieu de la suivante:

    <link rel="prefetch" href="<?php echo get_permalink($next_dress) ?>">
    <link rel="prerender" href="<?php echo get_permalink($next_dress) ?>">
2
paradroid

Si je comprends bien, vous mettez ce code dans header.php, dans le fichier single-dress.php à l'aide de get_header(), et dans le même fichier, après environ 2 douzaines lignes, vous définissez les variables que vous avez utilisées 2 douzaines de lignes avant .

Donc, votre serveur a une machine de temps intégrée ou votre code ne peut pas fonctionner.

Ce que vous devez faire, c'est simplement définir des variables avant de les utiliser.

Au lieu de modifier votre code et de remplir votre en-tête avec une série de if/elseif, vous pouvez probablement séparer votre logique de vos modèles.

Je vais écrire une classe simple qui gère le prélecture. Vous pouvez l'enregistrer dans un fichier séparé et l'exiger de votre functions.php.

S'il vous plaît lire les commentaires en ligne pour plus d'explications.

<?php
class My_Theme_Prefetcher {

    public $next_url;
    public $prev_url;

    function setup() {
        global $wp_query;
        // for empty query there is nothing to prefetch 
        if ( ! $wp_query instanceof WP_Query || $wp_query->found_posts <= 0  ) return;
        if ( $wp_query->is_archive() ) {
            // next page URL for archives, that is empty if there is no next page URL
            $this->next_url = get_next_posts_page_link();
        } elseif ( $wp_query->is_singular( 'dress' ) ) {
            // if on a single page view for dress CPT, run a query for dress posts
            $this->set_dress_query( $wp_query->get_queried_object_id() );
        }
        // A filter to easily get class instance and access to instance methods and vars
        add_filter( 'my_theme_prefetcher', function() { return $this; } );
        // output the prefetch strings on wp_head
        add_action( 'wp_head', array( $this, 'output' ) );
    }

    /**
    * Perform a query to get all dresses in same collection,
    * save adjacent post URLs into instance properties
    */
    function set_dress_query( $dressid ) {
        $args =  static::dress_query_args( $dressid );
        if ( empty( $args ) ) return;
        $dress_query = new WP_Query( $args );
        if ( $dress_query->found_posts > 0 ) {
            // some dresses found, discover and save adjacent URLs
            $adjacents = static::get_adjacents( $dressid, $dress_query->posts );
            if ( $adjacents['next'] ) 
                $this->next_url = get_permalink( $adjacents['next'] );
            if ( $adjacents['prev'] ) 
                $this->prev_url = get_permalink( $adjacents['prev'] );
        }
    }

    /**
    * Given a current ID and a set of posts, discover adjacent posts
    */
    static function get_adjacents( $current, Array $all ) {
        $adjacents = array( 'prev' => FALSE, 'next' => FALSE );
        if ( is_numeric( $current ) && ! empty( $all ) ) {
            $ids = wp_list_pluck( $all, 'ID' );
            $this_posts = array_search( $current, $ids );
            if ( $this_posts !== FALSE ) {
                $prev_i = $this_posts > 0 ? $this_posts -1 : FALSE;
                $next_i = $this_posts < count( $ids ) - 1 ? $this_posts + 1 : FALSE;
                $previous = $prev_i !== FALSE ? $all[ $prev_i ] : FALSE;
                $next = $next_i !== FALSE ? $all[ $next_i ] : FALSE;
                $adjacents = array( 'prev' => $previous, 'next' => $next );
            }
        }
        return $adjacents;
    }

    /**
    * Output prefetch string on wp_head. Do nothing if no, or invalid, URL is set
    */
    function output() {
        if (
            empty( $this->next_url ) ||
            ! filter_var( $this->next_url, FILTER_VALIDATE_URL )
        ) return;
        $format = '<link rel="prefetch" href="%1$s"><link rel="prerender" href="%1$s">';
        printf( $format, esc_url( $this->next_url ) );
    }

    /**
    * Returns the args for dress query for a given dress id.
    */
    static function dress_query_args( $dressid ) {
        $collections = get_the_terms( $dressid, 'collections' );
        if ( is_wp_error( $collections ) || empty( $collections ) ) return;
        $term = array_shift( $collections );
        $args = array(
            'post_type' => 'dress',
            'posts_per_page' => -1,
            'tax_query' => array(
                array( 'taxonomy' => 'collections', 'terms' => array( $term->term_id ) )
            ),
            'order' => 'ASC',
            'orderby' => 'title'
        );
        return $args;
    }

}

Toute la logique est dans la classe: lorsque la méthode setup() est appelée, la classe examine la requête en cours. S'il s'agit d'une archive, configurez l'URL suivante de la page d'archive suivante. Si la page concerne une seule vue vestimentaire, elle lance une requête pour obtenir toutes les robes dans la même collection et, si elle est trouvée, enregistre les URL de publication adjacentes dans des variables d'instance.

Maintenant, nous devons lancer la classe, c’est-à-dire appeler la méthode setup() sur un hook lancé après la requête principale est définie, mais avant wp_head() est appelé: 'template_include' sera parfait.

Je n'utilise pas template_redirect ici pour permettre une redirection plus rapide si nécessaire (sans déclencher la requête supplémentaire). Cependant, 'template_include' est un filtre, nous devons donc renvoyer le modèle actuel. Ajoutez à votre functions.php:

add_filter( 'template_include', function( $template ) {
    $prefetcher = new My_Theme_Prefetcher;
    $prefetcher->setup();
    return $template;
} );

Maintenant, il vous suffit de vous assurer que, dans votre header.php, il y a l'appel wp_head() et que les liens de prélecture seront ajoutés par la classe.

Il y a une autre tâche à faire. Dans le fichier modèle (single-dress.php), nous devons afficher les liens des publications adjacentes, mais nous n'avons pas besoin d'exécuter une autre requête, car les URL des publications adjacentes sont déjà enregistrées dans le My_Theme_Prefetcher instancié sur 'template_include'.

Nous devons donc accéder à cette instance et au filtre personnalisé 'my_theme_prefetcher' qui a été créé pour la portée.

Donc, dans le modèle, vous pouvez:

<figure class="pinboard">
    <?php

    // here goes your thumbnail image stuff, I will not copy it...

    // get the prefetcher instance and check it
    $prefetcher = apply_filters( 'my_theme_prefetcher', NULL );

    if ( $prefetcher instanceof My_Theme_Prefetcher ) { 
        // we got prefetcher instance, get the urls
        $prev_url = $prefetcher->prev_url ? : FALSE;
        $next_url = $prefetcher->next_url ? : FALSE;
    } else {
        // something goes wrong, try to run the query
        // function that returns arguments is static, so we can access it
        $args = My_Theme_Prefetcher::dress_query_args( $post->ID );
        $dress_by_tax = ! empty( $args ) ? new WP_Query( $args ) : FALSE;
        if ( $dress_by_tax instanceof WP_Query && ! empty( $dress_by_tax->posts ) ) {
            // function that returns adjacent posts is static, so we can access it
            $adjacents = My_Theme_Prefetcher::get_adjacents( $post->ID, $dress_by_tax->posts );
            $next_url = $adjacents['next'] ? get_permalink( $adjacents['next'] ) : FALSE;
            $prev_url = $adjacents['prev'] ? get_permalink( $adjacents['prev'] ) : FALSE;
        } else {
            $next_url = $prev_url = FALSE;
        }
    }
    ?>

    <?php if ( $next_url ) : ?>
        <div class="nav-next arrow block button spaced ribbon">
            <a href="<?php echo $next_url ?>">Next</a>
        </div>
    <?php endif; ?>

    <?php if ( $prev_url ) : ?>
        <div class="nav-prev arrow-left block button spaced ribbon2 left">
            <a href="<?php echo $prev_url ?>">Previous</a>
        </div>
    <?php endif; ?>

    <div class="mask"><span>Click for larger size</span></div>

</figure>
6
gmazzap