web-dev-qa-db-fra.com

Mise à jour du champ de publication personnalisé par Ajax sur le site en cache

Mon site mis en cache par le plug-in "wp-supper cache" et "cloudflare.com"

Donc, ma fonction php pour compter les vues de publication ne fonctionne pas correctement.

J'essaie d'utiliser ajax pour cela mais je ne suis pas avec le code JS, je ne peux donc pas savoir où est le problème.

Dans functions.php , je crée une fonction simple:

add_action('template_redirect', 'ajax_activation');
function ajax_activation(){
   //optional 
   wp_enqueue_script( 
      'ajax_script', 
       get_template_directory_uri() . '/js/ajax.js', // path to your js file for ajax operations
       array( 'jquery' ), false
   );
   //end optional
   wp_localize_script( 
      'ajax_script', // the name of your global.js registered file
      'ajax_object', // name 
       array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) // you can add other items for example for using a translated string in javascript/jquery context
   ); 
}

add_action('wp_ajax_get_PostViews', 'get_PostViews');
add_action('wp_ajax_nopriv_get_PostViews', 'get_PostViews');

function get_PostViews() {
$id = isset( $_POST['id'] ) ? $_POST['id'] : false;
$count_key = 'post_views_count'; 
$count = get_post_meta($post_ID, $count_key, true);
if( empty($count) ){ $count = 1; } else { $count++; }
update_post_meta($post_ID, $count_key, $count);
}

Code dans le fichier ajax.js :

var postID = $(".view_detail").attr("id");
jQuery.ajax({
    type: "POST",
    url: ajax_object.ajaxurl, // this is the object you defined in function.php
    data: {
       action: 'get_PostViews', // the name of your function
       id: postID // you can store it in html attribute for an easy access like: jQuery(element).attr('id');
    },
    success: function (result) {
    }
});

Le page.php de mon thème:

<div id="<?php the_ID(); ?>" <?php post_class('view_detail'); ?>>

S'il vous plaît dites-moi comment puis-je le faire fonctionner? Merci beaucoup!

1
Zen Nguyễn

J'ai repéré des erreurs ici:

jQuery.ajax({
     type: "POST",
     contentType: "application/json; charset=utf-8", // default: 'application/x-www-form-urlencoded; charset=UTF-8'. you can not set
     url: "http://localhost/wp-admin/admin-ajax.php", // if you have correctly enabled ajax in wp, you should use the object you set up with the url
     data: "{'action':'get_PostViews(" + idpost + ")'}", // you can use a PlainObject notation, so you don't need to double quoted. action property is the name of your function as you written in function.php
     success: function (result) {
       alert('Update Success!');
     }
});

Jetez un oeil ici jQuery.ajax () . Pour utiliser ajax dans WordPress, procédez comme suit:

  1. activer la fonctionnalité ajax
  2. déclarez votre fonction dans function.php
  3. utiliser javascript/jquery pour envoyer des données au serveur et écouter les données récupérées

Activation de ajax

Le meilleur moyen d'y parvenir (à mon avis) est:

//File functions.php
    add_action('template_redirect', 'ajax_activation');
    function ajax_activation(){
       //optional 
       wp_enqueue_script( 
          'ajax_script', 
           get_template_directory_uri() . '/js/jquery.ajax.js', // path to your js file for ajax operations
           array( 'jquery' ), false
       );
       //end optional
       wp_localize_script( 
          'ajax_script', // the name of your global.js registered file
          'ajax_object', // name 
           array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) // you can add other items for example for using a translated string in javascript/jquery context
       ); 
    }

Déclare une fonction

//File functions.php
add_action('wp_ajax_get_PostViews', 'get_PostViews');
add_action('wp_ajax_nopriv_get_PostViews', 'get_PostViews');

function get_PostViews() {
    $id = isset( $_POST['id'] ) ? $_POST['id'] : false;
    // your code here
    wp_die(); // | die(); you need this to avoid trailing zero
}

jQuery/Javascript

$.ajax({
    type: "POST",
    url: ajax_object.ajaxurl, // this is the object you defined in function.php
    data: {
       action: 'get_PostViews', // the name of your function
       id: // you can store it in html attribute for an easy access like: jQuery(element).attr('id');
    },
    success: function (result) {

    }
});

Je suppose que vous utilisez cette fonction pour toutes les publications en boucle. Vous pouvez appeler ajax une fois pour effectuer le travail pour toutes les publications. Par exemple, je veux récupérer avec ajax les titres de mes posts:

HTML

<html>
<!-- some stuff here -->
<h3 id="<?php echo get_the_ID(); ?>" class="spyhole"></h3> <!-- there are many of this :  ) -->
<!-- some stuff here -->
</html>

jQuery

ids = [];
items = $('.spyhole');
$.each( items, function( i, v){
    ids.Push( $(v).attr( 'id' ) ); // each value is added to array
});
$.ajax({
    type: "POST",
    url: ajax_object.ajaxurl,
    data: {
      action: 'getMyTitleAjax',
      id: ids
    },
    success: function (result) {
      data = $.parseJSON( result ); // Takes a well-formed JSON string and returns the resulting JavaScript object.
      $.each( data, function( i, v ){
        $('.spyhole[id="' + i + '"]').html( v ); // print the title
      });
    }
});

PHP

// Enabling ajax - functions.php
add_action('template_redirect', 'ajax_activation');
function ajax_activation(){
   //optional 
   wp_enqueue_script( 
      'ajax_script', 
       get_template_directory_uri() . '/js/jquery.ajax.js', // path to your js file for ajax operations
       array( 'jquery' ), false
   );
   //end optional
   wp_localize_script( 
      'ajax_script', // the name of your global.js registered file
      'ajax_object', // name 
       array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) // you can add other items for example for using a translated string in javascript/jquery context
   ); 
}

// Declare my function
add_action('wp_ajax_getMyTitleAjax', 'getMyTitleAjax', 3);
add_action('wp_ajax_nopriv_getMyTitleAjax', 'getMyTitleAjax', 3);
function getMyTitleAjax() {
    $ids = isset( $_POST['id'] ) ? $_POST['id'] : false; // check if there is something in global $_POST
    if( $ids && is_array( $ids ) ){
      foreach( $ids as $id ){
        $titles[$id] = get_the_title( $id ); 
      }
    }
    echo json_encode( $titles ); // prints the result
    wp_die(); // avoid trailing zero
}

J'espère que ça aide, si quelque chose n'est pas clair, n'hésitez pas à demander

Mettre à jour

Selon vos mises à jour de questions, changez ceci:

function get_PostViews() {
$id = isset( $_POST['id'] ) ? $_POST['id'] : false;
$count_key = 'post_views_count'; 
$count = get_post_meta($post_ID, $count_key, true);
if( empty($count) ){ $count = 1; } else { $count++; }
update_post_meta($post_ID, $count_key, $count);
}

avec ça:

function get_PostViews() {
$id = isset( $_POST['id'] ) ? $_POST['id'] : false;
$count_key = 'post_views_count'; 
$count = get_post_meta($id, $count_key, true);
if( empty($count) ){ $count = 1; } else { $count++; }
update_post_meta($id, $count_key, $count);
}
2
iEmanuele

single.php

// ------------Post  views----------          
<script type="text/javascript">
    // get post views
    (function($) {
        function mostViews() {
             $.getJSON("<?php bloginfo('template_directory'); ?>/ajax.php",
                    {
                        action: 'get_mostViewedPost',
                        postid: <?php echo get_the_ID() ?>
                    }, function (data) {
                    })
        }
        var mostViews = new mostViews();
    })(jQuery);

</script>

functions.php

// ------------Post  views----------
// function to display number of posts.
function getPostViews($postID){
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0 View";
    }
    return $count.' Views';
}

// function to count views.
function setPostViews($postID) {
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}

// Add it to a column in WP-Admin
add_filter('manage_posts_columns', 'posts_column_views');
add_action('manage_posts_custom_column', 'posts_custom_column_views',5,2);
function posts_column_views($defaults){
    $defaults['post_views'] = __('Views');
    return $defaults;
}
function posts_custom_column_views($column_name, $id){
    if($column_name === 'post_views'){
        echo getPostViews(get_the_ID());
    }
}

function postViews_callback(){
    setPostViews($_GET['postid']) ;
    echo "Success, Post id: ".$_GET['postid'];
    die();
}
add_action('ajax_get_mostViewedPost', 'postViews_callback');
add_action('ajax_nopriv_get_mostViewedPost', 'postViews_callback');

// -----------end Post views----------

ajax.php

<?php
//mimic the actuall admin-ajax
define('DOING_AJAX', true);

//make sure you update this line
//to the relative location of the wp-load.php

require_once(dirname(dirname(dirname(dirname($_SERVER['SCRIPT_FILENAME'])))) . '/wp-load.php');
//Typical headers
header('Content-Type: text/html');
send_nosniff_header();

//Disable caching
header('Cache-Control: no-cache');
header('Pragma: no-cache');

$action = esc_attr(trim($_GET['action']));


//A bit of security
$allowed_actions = array( 
    'get_mostViewedPost'
);

//For logged in users 
add_action('ajax_get_mostViewedPost', 'postViews_callback');
//For guests 
add_action('ajax_nopriv_get_mostViewedPost', 'postViews_callback');

if(in_array($action, $allowed_actions)) {
    if(is_user_logged_in())
        do_action('ajax_'.$action);
    else
        do_action('ajax_nopriv_'.$action);
} else {
    die('-1');
}
0
ji_feraou
single.php //post views -=================================================================================<br> <br> 




<script type="text/javascript"> <br> 
    // get post views <br> 
    (function($) { <br> 
        function mostViews() { <br> 
             $.getJSON("<?php bloginfo('template_directory'); ?>/ajax.php", <br> 
                    { <br> 
                        action: 'get_mostViewedPost', <br> 
                        postid: <?php echo get_the_ID() ?> <br> 
                    }, function (data) { <br> 
                    }) <br> 
        } <br> 
        var mostViews = new mostViews(); <br> 
    })(jQuery); <br> 
 <br> 
</script> <br> 





functions.php  <br> -=================================================================================   <br> 
// ------------Post  views---------- <br> 
// function to display number of posts. <br> 
function getPostViews($postID){ <br> 
    $count_key = 'post_views_count'; <br> 
    $count = get_post_meta($postID, $count_key, true); <br> 
    if($count==''){ <br> 
        delete_post_meta($postID, $count_key); <br> 
        add_post_meta($postID, $count_key, '0'); <br> 
        return "0 View"; <br> 
    } <br> 
    return $count.' Views'; <br> 
} <br> 
 <br> 
// function to count views. <br> 
function setPostViews($postID) { <br> 
    $count_key = 'post_views_count'; <br> 
    $count = get_post_meta($postID, $count_key, true); <br> 
    if($count==''){ <br> 
        $count = 0; <br> 
        delete_post_meta($postID, $count_key); <br> 
        add_post_meta($postID, $count_key, '0'); <br> 
    }else{ <br> 
        $count++; <br> 
        update_post_meta($postID, $count_key, $count); <br> 
    } <br> 
} <br> 
 <br> 
// Add it to a column in WP-Admin <br> 
add_filter('manage_posts_columns', 'posts_column_views'); <br> 
add_action('manage_posts_custom_column', 'posts_custom_column_views',5,2); <br> 
function posts_column_views($defaults){ <br> 
    $defaults['post_views'] = __('Views'); <br> 
    return $defaults; <br> 
} <br> 
function posts_custom_column_views($column_name, $id){ <br>  <br> 
    if($column_name === 'post_views'){ <br> 
        echo getPostViews(get_the_ID()); <br> 
    } <br> 
} <br> 
 <br> 
function postViews_callback(){ <br> 
    setPostViews($_GET['postid']) ; <br> 
    echo "Success, Post id: ".$_GET['postid']; <br> 
    die(); <br> 
} <br> 
add_action('ajax_get_mostViewedPost', 'postViews_callback'); <br> 
add_action('ajax_nopriv_get_mostViewedPost', 'postViews_callback'); <br> 
 <br> 
// -----------end Post views---------- <br> 


ajax.php  <br> -=================================================================================  <br> 
<?php <br> 
//mimic the actuall admin-ajax <br> 
define('DOING_AJAX', true); <br> 
 <br> 


//make sure you update this line <br> 
//to the relative location of the wp-load.php <br> 
 <br> 
require_once(dirname(dirname(dirname(dirname($_SERVER['SCRIPT_FILENAME'])))) . '/wp-load.php');
//Typical headers <br> 
header('Content-Type: text/html'); <br> 
send_nosniff_header(); <br> 
 <br> 
//Disable caching <br> 
header('Cache-Control: no-cache'); <br> 
header('Pragma: no-cache'); <br> 
 <br> 
$action = esc_attr(trim($_GET['action'])); <br> 
 <br> 

//A bit of security <br> 
$allowed_actions = array(  <br> 
    'get_mostViewedPost'
); <br> 

//For logged in users  <br> 
add_action('ajax_get_mostViewedPost', 'postViews_callback'); <br> 
//For guests 
add_action('ajax_nopriv_get_mostViewedPost', 'postViews_callback');
 <br> 
if(in_array($action, $allowed_actions)) { <br> 
    if(is_user_logged_in()) <br> 
        do_action('ajax_'.$action); <br> 
    else <br> 
        do_action('ajax_nopriv_'.$action); <br> 
} else { <br> 
    die('-1'); <br> 
} <br> 
0
ji_feraou