¿Cómo habilito la búsqueda previa de HTML5 en esta página?

2

Ejemplo del sitio: enlace

Actualmente tengo este bit de código en header.php, pero no funciona como se desea:

<?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 } ?>

La captación previa de la página de inicio apunta a una página que no existe. Me gustaría inhabilitar la búsqueda previa en la página de inicio.

Quiero habilitar la captura previa en estas páginas , para el vestido "Siguiente".

Este es el código para las páginas de vestimenta única.

Intenté esto, pero estaba vinculado a la página actual en lugar de a la siguiente:

    <link rel="prefetch" href="<?php echo get_permalink($next_dress) ?>">
    <link rel="prerender" href="<?php echo get_permalink($next_dress) ?>">
    
pregunta paradroid 21.03.2014 - 18:32

1 respuesta

6

Si entiendo correctamente, estás poniendo ese código en header.php , eso es requerido en el archivo single-dress.php usando get_header() , y en el mismo archivo, después aproximadamente 2 docenas de líneas, define las variables que usó 2 docenas de líneas antes .

Entonces, su servidor tiene una máquina de tiempo integrada o su código no puede funcionar.

Lo que tienes que hacer es definir las variables antes de usarlas.

Probablemente, en lugar de desordenar su código y llenar su encabezado con una serie de if / elseif , puede separar su lógica de sus plantillas.

Escribiré una clase simple que maneje el prefetching. Puede guardarlo en un archivo separado y solicitarlo a su functions.php .

Lea los comentarios en línea para obtener una explicación más detallada.

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

}

Toda la lógica está en la clase: cuando se llama al método setup() , la clase mira la consulta actual y, si es un archivo, configura la siguiente URL a la siguiente página de archivo. Si la página es para una vista de vestimenta única, entonces ejecuta una consulta para obtener todos los vestidos en la misma colección y, si se encuentra, guarda las URL de publicaciones adyacentes en las variables de instancia.

Ahora necesitamos iniciar la clase, es decir, llamar al método setup() en un gancho después de se establece la consulta principal, pero antes de wp_head() se llama: 'template_include' será perfecto.

No uso template_redirect aquí para permitir una redirección más rápida si es necesario (sin activar la consulta adicional). Sin embargo, 'template_include' es un filtro, por lo que debemos devolver la plantilla actual. Añade a tu functions.php :

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

Ahora, solo tiene que estar seguro de que en su header.php existe la llamada wp_head() y la clase agregará los enlaces de captación previa.

Hay otra tarea que hacer. En el archivo de plantilla ( single-dress.php ) debemos mostrar los enlaces de publicaciones adyacentes, pero no necesitamos ejecutar otra consulta, porque las URL de las publicaciones adyacentes ya están guardadas en My_Theme_Prefetcher instanciada en 'template_include' .

Por lo tanto, necesitamos acceder a esa instancia y al filtro personalizado 'my_theme_prefetcher' que se creó para el alcance.

Así que en la plantilla, puedes:

<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>
    
respondido por el gmazzap 25.03.2014 - 00:20

Lea otras preguntas en las etiquetas