web-dev-qa-db-ja.com

キャッシュされたサイトのAjaxによるカスタム投稿フィールドの更新

私のサイトは "wp-supper cache"プラグインと "cloudflare.com"でキャッシュされています

だから私のphp関数は投稿ビューの数が正しく機能していないことを数えます。

私はそれのためにajaxを使用しようとしますが、私はJSコードに慣れていないので、どこに問題があるのか​​わかりません。

functions.phpでは簡単な関数を作成します。

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

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) {
    }
});

私のテーマのpage.php

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

どうすればうまくいくか教えてください。どうもありがとうございました!

1
Zen Nguyễn

私はここでいくつかのエラーを見つけました:

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!');
     }
});

こちらを見てください jQuery.ajax() 。 WordPress内でajaxを使用するには、次の手順に従ってください。

  1. ajax機能を有効にする
  2. function.phpであなたの関数を宣言する
  3. javascript/jqueryを使用してデータをサーバーに送信し、取得したデータをリッスンする

ajaxを有効にする

それを達成するための最善の方法は(私の意見では):

//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
       ); 
    }

関数宣言

//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) {

    }
});

私はあなたがループ内のすべての記事に対してこの関数を使用していると思います、あなたはすべての記事に対して作業を行うために一度ajaxを呼び出すことができます。たとえば、私は私の投稿のタイトルをajaxで取得したいです。

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
}

何かが明確ではない場合はお気軽にお尋ねください

更新

あなたの質問の更新に応じて、これを変更してください。

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

これとともに:

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