Comme on le sait assez bien, il est possible de programmer la publication de publications dans Wordpress.
Les pièces jointes sont également des messages (au sens plus technique et interne).
La question qui me dérange en ce moment est la suivante: est-il possible de planifier des pièces jointes? Par exemple, une galerie de photos grandit avec le temps?
Mon idée est que vous pouvez configurer une date de publication pour les pièces jointes. Cela peut être fait en utilisant attachment_fields_to_edit
pour afficher l'interface utilisateur (il est possible d'utiliser la fonction interne touch_time
).
Après cela, vous pouvez filtrer toutes les requêtes de pièces jointes pour afficher uniquement les pièces jointes avec une date passée ou actuelle.
Alors
add_action('load-post.php', 'setup_attachment_fields');
function setup_attachment_fields() {
$scr = get_current_screen();
if ( $scr->post_type === 'attachment' ) {
add_filter("attachment_fields_to_edit", "add_date_to_attachments", null, 2);
}
}
function add_date_to_attachments( $form_fields, $post = NULL ) {
printf('<label for="content"><strong>%s</strong></label>', __('Date'));
touch_time( 1, 1, 0, 1 );
return $form_fields;
}
Maintenant, sur la page des pièces jointes, vous verrez quelque chose comme:
Maintenant, fixons la date de publication sur la sauvegarde de la pièce jointe:
add_filter("attachment_fields_to_save", "save_date_to_attachments");
function save_date_to_attachments( $post ) {
foreach ( array('mm', 'jj', 'aa', 'hh', 'mn') as $f ) {
$$f = (int) filter_input(INPUT_POST, $f, FILTER_SANITIZE_NUMBER_INT);
}
if ( ! checkdate ( $mm, $jj, $aa ) ) return; // bad data, man
if ( ($hh < 0 || $hh > 24) ) $hh = 0;
if ( ($mn < 0 || $mn > 60) ) $mn = 0;
$ts = mktime($hh, $mn, 0, $mm, $jj, $aa);
$date = date( 'Y-m-d H:i:s', $ts );
$date_gmt = date( 'Y-m-d H:i:s', ( $ts + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) );
$modified = current_time( 'mysql');
$modified_gmt = current_time( 'mysql', true);
global $wpdb;
$data = array(
'post_date' => $date,
'post_date_gmt' => $date_gmt,
'post_modified' => $modified,
'post_modified_gmt' => $modified_gmt,
);
$wpdb->update( $wpdb->posts, $data, array( 'ID' => $post['ID'] ), '%s', '%d' );
}
Lorsque la pièce jointe est enregistrée, la date de publication est définie sur celle que vous avez définie dans les champs de date.
Cependant, les pièces jointes sont toutes visibles, quelle que soit la date, car WordPress ne vérifie pas la date des requêtes sur les pièces jointes. Ajoutons un filtre à la clause where pour cela:
add_filter( 'posts_where', 'not_future_attachment', 9999, 2 );
function not_future_attachment( $where, $query ) {
if ( is_admin() ) return $where;
if ( $query->get('post_type') === 'attachment' ) {
global $wpdb;
$where .= $wpdb->prepare(
" AND ($wpdb->posts.post_date <= %s)", current_time( 'mysql')
);
}
return $where;
}
Maintenant, dans un shortcode pour la galerie (ou où que vous soyez), assurez-vous d'utiliser WP_Query
pour configurer l'argument de type de publication sur 'attachment'
.
Sur un shortcode [gallery]
standard, cela ne fonctionnera pas car il utilise get_children
où les filtres de requête sont supprimés. Vous devez donc créer un shortcode personnalisé ou écraser le code par défaut.
Créez la galerie complète en une fois, utilisez un gestionnaire de shortcode personnalisé.
Dans votre gestionnaire de shortcode, comptez simplement les pièces jointes d'un calendrier de l'avent ou recherchez une méta de publication pour la pièce jointe. Remplacez l’image par un espace réservé ou masquez-la complètement si elle ne doit pas être vue pour le moment.
Une pièce jointe est publique au moment du téléchargement, car WordPress n'est pas impliqué dans la demande directe de fichier.