web-dev-qa-db-fra.com

Comment changer le contenu avec le changement d'emplacement?

Je dois développer un site utilisant WordPress ayant des milliers de pages. Les pages auront le même contenu, mais l'emplacement du contenu changera. Par exemple, l'emplacement sera Sydney, Melbourne, etc. Existe-t-il un moyen de gérer les pages virtuelles? Les pages doivent également être indexées dans le moteur de recherche. Quelqu'un peut-il me suggérer de le faire de manière efficace?

Merci d'avance

1
user478

Théorie

Comme Wordpress n’a pas de script de détection de géolocalisation intégré, nous devrons créer le nôtre. Comme ce script est javascript, nous devons ensuite obtenir les données de localisation obtenues en php. Ensuite, nous pouvons faire une demande ou ajouter quelque chose à notre demande.

Je vais maintenant vous donner des parties de code, des explications et des points de départ, qui vous permettront de construire un plugin (inutile de construire une telle logique dans un thème).

Javascript et localisation

Nous avons d’abord besoin d’une fonction capable de faire la détection. Il y a beaucoup de possibilités là-bas. Vous pouvez voir une solution possible ci-dessous. Enregistrez-le dans un fichier, appelez geo_detection.js et enregistrez-le dans un nouveau dossier de plug-in, dans un sous-répertoire nommé /js. (Vous pouvez aussi choisir une autre solution).

/**
 * GLOBAL POSITION VAR
 */
var currentPosition = getCurrentPosition();
/**
 * Gets current position
 * 
 * @return mixed false/position obj
 */
function getCurrentPosition()
{
    // Current position
    if ( navigator.geolocation ) 
    {
        navigator.geolocation.getCurrentPosition ( 
            function( position ) 
            {
                return position;
            }
        );
    }
    return false;
}

Ce script ne pourra pas effectuer de détection réelle si l'utilisateur n'est pas sur un appareil mobile, car la plupart des fournisseurs refusent l'accès, mais c'est exact assez pour avoir le centre de la ville et découvrir le pays dans la plupart des cas.

Transférer les données du périphérique en PHP: les scripts dont nous avons besoin

Pour traiter plus avant les données, nous avons besoin de celles-ci disponibles en php, sinon nous ne pourrions pas faire la demande de base de données (ni interagir avec une autre).

Volontiers WP a une fonction que nous pouvons (rater) utiliser dans ce cas: wp_localize_script();.

/**
 * Register Script
 */
function wpse53244_register_script()
{
    foreach ( array( 'geo_detection', 'geo_ajax' ) as $file )
    {
        wp_register_script( 
             $file
            ,trailingslashit( plugins_url( 'js', __FILE__ ) )."/js/{$file}.js"
            ,array( 'json2', 'jquery' )
            ,filemtime( plugin_dir_path( __FILE__ )."/js/{$file}.js" )
        );
    }
}
add_action( 'admin_enqueue_scripts', 'wpse53244_register_script' );
/**
 * Enqueue & Localize our script
 */
function wpse53244_enqueue_script()
{
    wp_enqueue_script( 'geo_detection' );
    wp_enqueue_script( 'geo_ajax' );
    wp_localize_script( 
         'geo_ajax'
        ,'geo_ajax_object'
        ,array( 
             'ajaxurl'     => admin_url( 'admin-ajax.php' )
            ,'_ajax_nonce' => wp_create_nonce( 'geo_ajax_nonce' )
            ,'action'      => 'geo_ajax'
            ,'location'    => ''
         ) 
    );
}
add_action( 'admin_enqueue_scripts', 'wpse53244_enqueue_script' );

Apporter les données du périphérique à PHP: Traitement des données

Premièrement, nous voulons traiter les données en utilisant un autre fichier ajax appelé geo_ajax.js qui doit également être enregistré dans notre dossier /js. La fonction jQuery.ajax() ci-dessous contient des gestionnaires/fonctions pour toutes les sortes ou tâches: succès, erreur et achèvement. Nous n'utiliserons que le succès pour l'instant.

jQuery( document ).ready( function($) 
{
    $.ajax( {
         type:     'POST'
        ,url:      geo_ajax_object.ajaxurl
        ,data:     currentPosition
        ,success:  function( response, status, request )
         {
            return currentPosition;
         }
        ,error:    function( jqxhr , settings , exception )
         {
            return false;
         }
        ,complete: function( jqxhr, status )
         {
            return false;
         }
    } );
} );

Ensuite, nous allons ajouter notre requête php AJAX. Cela nécessite également un contrôle de sécurité.

/**
 * AJAX Callback
 */
function wpse53244_do_location_request()
{
    header( "Content-Type: application/json" );

    // Valid request type?
    wpse53244_is_save_allowed( $_POST );

    // Get our location
    $location = $_POST['data'];

    // Actually processing the data:
    // This here completely depends on how you implement the localized content.
    // You could add additional meta boxes/custom fields, etc.
    // Whatever you can imagine or code...

    // Then you can here intercept the query with the 'posts_clauses' or
    // 'posts_where' filter and add the additional meta data to the query

    // Feedback
    echo json_encode( array(
         'success' => true
        ,'error'   => false
    ) );
    exit();
}
add_action( "wp_ajax_geo_ajax", 'wpse53244_do_location_request' );

/**
 * Valid request?
 */
function wpse53244_is_save_allowed( $data )
{
    // Safety check
    check_ajax_referer( 'geo_ajax_nonce', '_ajax_nonce' );

    $deny = json_encode( array(
         'success' => false
        ,'error'   => true
    ) );

    // AJAX autosave
    if ( 
        defined( 'DOING_AUTOSAVE' ) 
        AND DOING_AUTOSAVE 
    )
        exit();

    // Some other request
    if ( 
        ! isset( $_POST['action'] )
        OR 'geo_ajax' !== $_POST['action']
        )
    {
        echo $deny;
        exit();
    }
}

Résumé

Comme vous pouvez le voir ci-dessus, il y a des tas de choses à considérer. Ce que j’ai montré ↑ est juste un point de départ , car il existe des dizaines de routes que vous pouvez utiliser pour écrire un plugin complet qui dépasserait le contenu d'une réponse. La bonne chose est que: vous disposez maintenant d'un environnement sécurisé pour commencer à boucler vos appels à la base de données. Mais la solution dépend de la manière dont vous souhaitez la mettre en œuvre.

2
kaiser