Je travaille avec un thème enfant et un fichier functions.php pour ajouter une image aux publications ayant une balise spécifique (Videos
dans le code). J'essayais de créer la fonction, mais j'ai quelques problèmes, l'un d'entre eux est que lorsque je charge un message avec cette balise, il se bloque, il semble rester en boucle, puis je dois supprimer manuellement tous les images répétées (je n'en veux qu'une) des publications de la base de données (PhpMyAdmin)
Pourriez-vous m'aider à résoudre le problème et avoir un code fonctionnel?
Mise à jour importante : J'utilise un flux RSS et j'exige que cette image figure également dans le flux (je veux dire dans la base de données de la table posts)
Voici mon code dans functions.php
:
/**
* Prepend image to post if it has a specific tag
*
* @param String $content - WP Post Content for display
*
* @return String $content - WP Post Content for display
*/
function theme_videos_append_image( $content ) {
global $post;
// It would be easier if you got this URL from Attachment ID
$upload_dir_arr = wp_upload_dir(); // Get upload directory array ( https://developer.wordpress.org/reference/functions/wp_upload_dir/#user-contributed-notes )
$static_image_url = $upload_dir_arr['baseurl'] . '/2017/11/upliftingscroll.jpg';
// Ensure we are viewing a Post, and it has the Videos tag
if( has_tag( 'Videos', $post->ID ) ) {
$has_image = get_post_meta( $post->ID, '_video_image_added', true ); // Check if our postmeta exists
// If is does not have our postmeta - add it
if( empty( $has_image ) ) {
$image = sprintf( '<p><img src="%1$s" alt="" class="img-responsive" /></p>', $static_image_url ); // Create image
$content = $image . $content; // prepend image
// Update post so we don't need to add the image again
$success = wp_update_post( array(
'ID' => $post->ID,
'post_content' => $image . $post->post_content,
) );
// If the post updated, create postmeta letting us know later it has the image
if( false !== $success && !is_wp_error( $success ) ) {
update_post_meta( $post->ID, '_video_image_added', true );
}
}
}
return $content;
}
add_filter( 'the_content', 'theme_videos_append_image' );
Voici une version plus simple de votre fonction:
<?php
add_filter( 'the_content', 'theme_videos_append_image' );
function theme_videos_append_image( $content ) {
global $post;
$upload_dir_arr = wp_upload_dir();
$static_image_url = $upload_dir_arr['baseurl'] . '/2017/11/upliftingscroll.jpg';
$tag = '<p><img src="' . $static_image_url . '" alt="" class="img-responsive" /></p>';
return has_tag( 'Videos', $post->ID ) ? $tag . $content : $content;
}
?>
Vérifiez si c'est la solution la plus élégante pour obtenir l'URL de l'image. Cela me semble un peu bizarre.
La boucle que vous avez mentionnée existe probablement car, dans wp_update_post
, le filtre the_content
peut également être appliqué. Donc, si vous voulez vous en tenir à votre solution, essayez d’ajouter d’abord la publication meta, puis de mettre à jour le contenu de la publication ... mais je ne pense pas que cela soit nécessaire.
Étendre les solutions de Johannes Grandy. Vous devez également vous connecter au filtre the_excerpt_rss
en faisant:
add_filter('the_excerpt_rss', 'theme_videos_append_image');
add_filter( 'the_content', 'theme_videos_append_image' );
function theme_videos_append_image( $content ) {
global $post;
$upload_dir_arr = wp_upload_dir();
$static_image_url = $upload_dir_arr['baseurl'] . '/2017/11/upliftingscroll.jpg';
$tag = '<p><img src="' . $static_image_url . '" alt="" class="img-responsive" /></p>';
return has_tag( 'Videos', $post->ID ) ? $tag . $content : $content;
}