I have a small number of MP3 files on my site and I want to track the number of times the play button is pressed. I am using the inbuilt Wordpress MP3 player and have inserted the file by using media within the text editing area so I have:
[audio mp3=".mp3"][/audio]
Within the functions.php
file in my child theme I have the following:
add_action( 'wp_footer', function () {
?>
<script>
jQuery(document).ready(function() {
(function ($) {
var srcs = []; // Array of sources already sent to cut down on posts to server.
$('audio.wp-audio-shortcode, .wp-audio-playlist audio').on('play', function (event) {
// this.src should be the url (guid) of the audio file
if (this.src && $.inArray(this.src, srcs) === -1) {
srcs.push(this.src);
$.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', {
action: 'wpse168584_audio_stats',
guid: this.src.replace(/\?.+$/, ''), // Remove any query vars.
nonce: '<?php echo wp_create_nonce( 'wpse168584_audio_stats_' ); ?>'
}, null, 'json'
);
}
});
})(jQuery);
});
</script>
<?php
} );
function wpse168584_audio_stats() {
$ret = array( 'error' => false );
if ( ! check_ajax_referer( 'wpse168584_audio_stats_', 'nonce', false /*die*/ ) ) {
$ret['error'] = __( 'Permission error', 'wpfm' );
} else {
if ( ! isset( $_REQUEST['guid'] ) || ! ( $guid = $_REQUEST['guid'] ) ) {
$ret['error'] = __( 'Params error', 'wpfm' );
} else {
global $wpdb;
$sql = $wpdb->prepare( 'SELECT ID FROM ' . $wpdb->posts . ' WHERE guid = %s LIMIT 1', $guid );
if ( $post_id = $wpdb->get_var( $sql ) ) {
// Use hex format to save space, 8 bytes for IPv4, 32 for IPv6.
$ip = bin2hex( inet_pton( preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] ) ) );
if ( ! ( $meta = get_post_meta( $post_id, '_wp_attachment_metadata', true ) )
|| ! isset( $meta['plays_ips'] )
|| ! in_array( $ip, $plays_ips = explode( ';', $meta['plays_ips'] ) ) ) {
$plays_ips[] = $ip;
// If data getting too big, drop off oldest ip (FIFO).
if ( strlen( $meta['play_ids'] ) > 1000 ) array_shift( $plays_ips );
// Save as string to save space.
$meta['plays_ips'] = implode( ';', $plays_ips );
$meta['plays'] = isset( $meta['plays'] ) ? $meta['plays'] + 1 : 1;
update_post_meta( $post_id, '_wp_attachment_metadata', $meta );
}
}
}
}
wp_send_json( $ret );
}
add_action( 'wp_ajax_nopriv_wpse168584_audio_stats', 'wpse168584_audio_stats' );
add_action( 'wp_ajax_wpse168584_audio_stats', 'wpse168584_audio_stats' );
add_filter( 'media_submitbox_misc_sections', function ( $arr ) {
$arr['plays'] = __( 'Play Count:' );
return $arr;
} );
I did expect that the number of times the play button was clicked would show up in the read only area if I edit the media file, but nothing is appearing.
Can some kind person tell me where I am going wrong please?
Many thanks
A.