web-dev-qa-db-fra.com

compte wordpress compte clics par adresse ip

Je construis un site Web wordpress, qui aura une option pour télécharger le fichier Zip à partir de certains types de messages personnalisés. En cliquant sur le bouton de téléchargement, l'utilisateur commence automatiquement par télécharger le fichier Zip.

<a id="countable_link" href="#">download</a>

Mon objectif est d’afficher le nombre de téléchargements à côté du même bouton. Jusqu'à présent, tout fonctionne bien, sauf le fait que je puisse déclencher un nombre infini de fois.

Au lieu de cela, j'aimerais que ce compteur ne puisse être exécuté qu'une seule fois par l'utilisateur unique. Je suppose que cela doit faire quelque chose avec l'adresse IP des utilisateurs, mais ma connaissance de PHP, SQL et ajax est extrêmement faible.

Voici le script que j'ai trouvé: (il a également été posté ici )

<?php

if ( is_admin() ) add_action( 'wp_ajax_nopriv_link_click_counter',  'link_click_counter' );
function link_click_counter() {

    if ( isset( $_POST['nonce'] ) &&  isset( $_POST['post_id'] ) && wp_verify_nonce( $_POST['nonce'], 'link_click_counter_' . $_POST['post_id'] ) ) {
      $count = get_post_meta( $_POST['post_id'], 'link_click_counter', true );
      update_post_meta( $_POST['post_id'], 'link_click_counter', ( $count === '' ? 1 : $count + 1 ) );
     }
     exit();
}


add_action( 'wp_head', 'link_click_head' );
function link_click_head() {
    global $post;

    if( isset( $post->ID ) ) {
    ?>
   <script type="text/javascript" >
   jQuery(function ($) {
      var ajax_options = {
        action: 'link_click_counter',
        nonce: '<?php echo wp_create_nonce( 'link_click_counter_' . $post->ID ); ?>',
        ajaxurl: '<?php echo admin_url( 'admin-ajax.php' ); ?>',
        post_id: '<?php echo $post->ID; ?>'
      };

     $( '#countable_link' ).on( 'click ', function() {
        var self = $( this );
        $.post( ajax_options.ajaxurl, ajax_options, function() {
           window.location.href = self.attr( "href" );
       });
       return false;
    });
});
</script>
<?php
    }
}
?>

Lorsque je mets cet extrait dans mon fichier functions.php, il génère une valeur de champ personnalisée avec le nombre exact de clics. Ce serait génial si ces chiffres sont plus réalistes. Par exemple, si elle affiche une valeur de 350, les utilisateurs aimeraient vraiment savoir que 350 utilisateurs différents ont téléchargé le contenu.

Je suis reconnaissant pour toute solution à côté d'utiliser des plugins supplémentaires. Si, d’une manière ou d’une autre, on peut incorporer ce bout de code, le cercle sera parfait pour moi.

Merci,

1
gundra

Que feriez-vous si l'utilisateur utilise un proxy et randomise son adresse IP? Il existe de nombreux plug-ins de navigateur pour simplifier cela en un clic d'un bouton pour télécharger plusieurs fois. La même chose vaut pour les cookies. En plus de cela, vous essayez de collecter des données permettant d'identifier les utilisateurs, ce qui est illégal dans de nombreux pays.

Ce qui (pourrait) mieux fonctionner est un hachage jetable que vous ajoutez en tant que métadonnées. Exemple qui ajoute un tel hachage lors de la publication d’une publication - dans ce cas, la date de publication hachée md5 est l’horodatage UNIX:

add_action( 'draft_to_publish', function( \WP_Post $post )
{
    add_post_meta( 
        $post->ID, 
        'download_hash', 
        md5( date( 'U', $post->post_date ), 
        true 
    );
} );

(Vous pouvez construire votre hash comme bon vous semble).

Ensuite, lorsqu'un utilisateur télécharge un fichier, définissez simplement une méta-valeur d'utilisateur avec ce hachage comme clé et une valeur de 1/true/foo. Lors du téléchargement, il vous suffit de vérifier si le download_hash actuel est déjà une méta-valeur utilisateur et vous pouvez alors refuser le téléchargement.

Pour implémenter un compteur, vous devez simplement ajouter une autre méta-valeur de pièce jointe nommée download_users dans laquelle vous enregistrez un tableau d'ID utilisateur. Terminé.

1
kaiser