Skip to content

Instantly share code, notes, and snippets.

@thierrypigot
Created March 31, 2023 08:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thierrypigot/4ef9d60f5a33ab5172acb6953933f301 to your computer and use it in GitHub Desktop.
Save thierrypigot/4ef9d60f5a33ab5172acb6953933f301 to your computer and use it in GitHub Desktop.
Compteur de vues WordPress
<?php
/*
Plugin Name: Compteur de vues d'articles
Plugin URI: https://example.com/plugins/compteur-de-vues-darticles
Description: Ce plugin permet de compter les vues d'un article ou d'un custom post type.
Version: 1.0
Author: Votre nom
Author URI: https://example.com
License: GPL-2.0+
License URI: http://www.gnu.org/licenses/gpl-2.0.txt
Text Domain: compteur-de-vues
Domain Path: /languages
*/
class CompteurVues {
public function __construct() {
// Charger les fichiers de traduction
add_action('plugins_loaded', [$this, 'load_textdomain']);
// Hooks pour les actions et les filtres
add_action('wp', [$this, 'prevenir_mauvaise_stat']);
add_action('admin_init', [$this, 'ajouter_filtres_actions_types_suivis'],1);
add_action('admin_menu', [$this, 'compteur_vues_menu']);
add_action('admin_init', [$this, 'compteur_vues_settings']);
}
/**
* Charger les fichiers de traduction pour l'internationalisation.
*/
public function load_textdomain(): void {
load_plugin_textdomain('compteur-vues', false, basename(dirname(__FILE__)) . '/languages');
}
/**
* Ajoute un compteur de vues lors de la consultation d'un article.
*
* @param int $post_id L'ID de l'article.
*/
public function ajouter_vue(int $post_id): void {
$compteur_vues = get_post_meta($post_id, 'compteur_vues', true);
if ($compteur_vues === '') {
add_post_meta($post_id, 'compteur_vues', 1);
} else {
update_post_meta($post_id, 'compteur_vues', $compteur_vues + 1);
}
}
/**
* Empêche l'augmentation du compteur de vues lors de l'actualisation de la page.
*/
public function prevenir_mauvaise_stat(): void {
if (is_singular(get_option('compteur_vues_types_suivis', array()))) {
global $post;
if (!isset($_COOKIE['compteur_vues_' . $post->ID])) {
$this->ajouter_vue($post->ID);
setcookie('compteur_vues_' . $post->ID, '1', time() + 3600, COOKIEPATH, COOKIE_DOMAIN, false);
}
}
}
/**
* Affiche le nombre de vues d'un article.
*
* @param int $post_id L'ID de l'article.
* @return int Le nombre de vues de l'article.
*/
public function afficher_vues(int $post_id): int {
$compteur_vues = get_post_meta($post_id, 'compteur_vues', true);
return $compteur_vues === '' ? 0 : $compteur_vues;
}
/**
* Ajoute une colonne pour les vues dans la liste des articles de l'administration.
*
* @param array $colonnes Les colonnes existantes.
* @return array Les colonnes mises à jour.
*/
public function ajouter_colonne_vues(array $colonnes): array {
$colonnes['compteur_vues'] = __('Vues', 'compteur-vues');
return $colonnes;
}
/**
* Affiche le nombre de vues dans la colonne 'Vues
* pour chaque article.
*
* @param string $colonne Le nom de la colonne.
* @param int $post_id L'ID de l'article.
*/
public function afficher_colonne_vues(string $colonne, int $post_id): void {
if ($colonne == 'compteur_vues') {
echo $this->afficher_vues($post_id);
}
}
/**
*
*Ajoute les filtres et les actions pour les types d'articles sélectionnés dans les options.
*/
public function ajouter_filtres_actions_types_suivis(): void {
$post_types = get_option('compteur_vues_types_suivis', array());
foreach ($post_types as $post_type ) {
add_filter('manage_'. $post_type .'_posts_columns', [$this, 'ajouter_colonne_vues']);
add_action('manage_'. $post_type .'_posts_custom_column', [$this, 'afficher_colonne_vues'], 10, 2);
}
}
/**
* Ajoute une page de réglages pour le plugin.
*/
public function compteur_vues_menu(): void {
add_options_page(__('Réglages du Compteur de Vues', 'compteur-vues'), __('Compteur de Vues', 'compteur-vues'), 'manage_options', 'compteur-vues', [$this, 'compteur_vues_options']);
}
/**
* Affiche la page de réglages.
*/
public function compteur_vues_options(): void {
?>
<div class="wrap">
<h1><?php echo esc_html(__('Réglages du Compteur de Vues', 'compteur-vues')); ?></h1>
<form method="post" action="options.php">
<?php
settings_fields('compteur-vues-settings');
do_settings_sections('compteur-vues-settings');
?>
<table class="form-table">
<tr valign="top">
<th scope="row"><?php echo esc_html(__('Types d\'articles à suivre', 'compteur-vues')); ?></th>
<td>
<?php
$types_suivis = get_option('compteur_vues_types_suivis', array());
$types = get_post_types(array('public' => true), 'objects');
foreach ($types as $type) {
$checked = in_array($type->name, $types_suivis) ? 'checked' : '';
echo '<label><input type="checkbox" name="compteur_vues_types_suivis[]" value="' . $type->name . '" ' . $checked . '> ' . $type->label . '</label><br>';
}
?>
</td>
</tr>
</table>
<?php submit_button(); ?>
</form>
</div>
<?php
}
/**
* Enregistre les réglages.
*/
public function compteur_vues_settings(): void {
register_setting('compteur-vues-settings', 'compteur_vues_types_suivis');
}
}
new CompteurVues();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment