J'ai quelques problèmes pour créer un shortcode qui interroge certains messages. Voici les bases de mon code:
function shortcode_equipment($atts, $content = null) {
$equipment = get_page_by_title($content, OBJECT, 'equipment');
$loop = new WP_Query( array(
'posts_per_page' => 1,
'post_type' => 'equipment',
'page_id' => $equipment->ID
) );
while( $loop->have_posts() ) { $loop->the_post();
*misc code*
wp_reset_postdata();
return $string;
}
}
add_shortcode( 'item', 'shortcode_equipment' );
Maintenant, normalement, cela fonctionne bien pour 99% de mes messages. Il interroge la publication en fonction de ce qui est écrit à l'intérieur du titre [item] et ajoute ici un shortcode [/ item], puis affiche un effet d'infobulle/survol personnalisé en conséquence.
Toutefois, si le titre de mon message contient une apostrophe (ex: Mal's Post), il est alors interrompu et interroge le dernier message de ce type de message personnalisé.
Alors, comment puis-je obtenir que cela fonctionne avec des apostrophes dans les titres des publications?
Title Hello world!@#$%^*(),.;:\
fonctionnera mais tout titre saisi contenant des caractères ' " < > &
ne fonctionnera pas car dans la variable $content
que vous avez échappé Entités HTML , Mal's Post devient Mal’s Post
.
Pour le contourner, vous pouvez utiliser sanitize_title
function avec get_page_by_path
.
function shortcode_equipment($atts, $content = null) {
$path = sanitize_title($content);
$equipment = get_page_by_path( $path, OBJECT, 'equipment');
Le reste du code fonctionne comme avant.
Il y a très probablement un problème qui se passe là-bas. Essayez d'échapper au titre avant de le transmettre à votre shortcode, en utilisant sanitize_title_for_query()
, sanitize_title()
ou même esc_html()
:
$content = sanitize_title_for_query( $content );
$equipment = get_page_by_title( $content, OBJECT, 'equipment' );
Plus d'informations sur les données d'échappement peuvent être trouvées ici .