web-dev-qa-db-fra.com

Quel est le filtre approprié pour ajouter du code HTML à un titre de publication/page?

Je souhaite utiliser le texte Unicode en Birmanie sur mon blog. Malheureusement, les polices pseudo-Unicode Myanmar sont courantes. J'écris donc un plugin qui entourera toutes les phrases du Myanmar avec des balises HTML span et utilisera CSS pour sélectionner la police appropriée.

Tout fonctionne correctement pour le contenu, les commentaires, etc. Cependant, après l'ajout de HTML à l'aide du crochet the_title, ce code HTML est échappé, puis inclus dans l'attribut title de la balise link dans la section posts récents. En outre, je vois les balises HTML brutes dans le nom du message sur mon écran de poste administrateur.

Comment dois-je résoudre ce problème? Je préfère tout faire à partir de mon plugin, pas changer les fichiers de thème ou quelque chose.

Voici mon code:

add_filter( 'the_title', 'addThemSpans');
function addThemSpans($theTitle) {
  // functionality to add span tags to $theTitle so that a title that looks like this...
    // LatinTextHere ကကကကက​ MoreLatinText
  // becomes this...
    // LatinTextHere <span class="myText">ကကကကက</span> MoreLatinText
    // in the final output.
  return $theModifiedTitle;
}

Dans l'état actuel des choses, l'attribut title du lien dans le widget de barre latérale de publications récentes est défini sur:

LatinTextHere &lt;span class=&#039;myText&#039;&gt;ကကကကက&lt;/span&gt;<span class='myText'>ကကကကက</span> MoreLatinText

Ce qui n'est pas juste.

3
Ben Sharon

Ok, je pensais poster ma solution finale ici au cas où quelqu'un aurait le même problème. En gros, je dois ajouter de nouveaux points d'ancrage à mes fichiers de thème, puis envoyer le titre de l'article modifié à ces points d'ancrage.

Mon code de plugin ressemble maintenant à:

add_filter( 'the_html_safe_title', 'addThemSpansToPostTitles' );
function addThemSpansToPostTitles() {
  global $post;
  echo addThemSpans($post->post_title);
  // This is the same function I listed in the question.
}

Ensuite, dans les fichiers de modèle de thème, où il était auparavant:

<?php the_title(); ?>

Je le change en:

<?php do_action( 'the_html_safe_title' ); ?>

C'est moins qu'idéal pour au moins deux raisons:

  1. Les titres dans des emplacements tels que le widget Articles récents ne sont pas insérés, ce qui signifie que, selon le navigateur de la visionneuse, les paramètres de police et les polices installées, la visionneuse verra toujours du texte mutilé à ces emplacements.

  2. Cela rend beaucoup plus difficile le partage du plug-in avec d'autres blogueurs de langue birmane qui n'ont peut-être pas les compétences techniques pour modifier leurs thèmes et qui peuvent ne pas vouloir utiliser mon thème.

Attention développeurs wordpress: J'ai vu un nombre important de personnes en ligne souhaiter pouvoir inclure du HTML dans leurs titres d'articles et de pages. Cela nous semble logique, non seulement pour les situations de spécialité telles que la mienne, mais également pour les utilisateurs qui souhaitent modifier leurs titres de manière différente. Veuillez envisager de modifier les futures pressions de mots pour autoriser le HTML dans les titres.

1
Ben Sharon

Donc, ce qui se passe, c'est que the_title_attribute(), qui renvoie l'attribut title dans les liens du widget Recent Posts, appelle get_the_title(); ainsi, votre filtre the_title est appliqué à la chaîne renvoyée par the_title_attribute().

Une idée serait de s'assurer que get_the_title est appelé à partir de la boucle de requête principale (avertissement: si vous utilisez des boucles WP_Query(), cette approche ne fonctionnerait pas pour elles).

Peut-être quelque chose comme ça (non testé).

Modifier

Cela ne fonctionnera pas comme écrit. Si vous pouviez trouver un moyen de récupérer l'objet $query actuel à l'intérieur de get_the_title(), alors vous pourriez faire quelque chose comme ceci:

function wpse82297_filter_the_title( $title ) {
    // Need some way to identify the current query object
    $query = '';
    // If this isn't the main query, return
    if ( ! $query->is_main_query() ) {
        return $title;
    } else {
        // Your $title filtering goes here
        return $modified_title;
    }
}
add_filter( 'the_title', 'wpse82297_filter_the_title' );

Cela éviterait donc que votre filtre soit appliqué aux éléments du menu de navigation, aux widgets de messages récents, etc., à l'exception de la boucle de requête principale.

Je laisserai ceci ici comme réponse, au cas où n'importe qui pourrait penser à un moyen d'identifier l'objet $query actuel.

1
Chip Bennett

the_title est le bon crochet. Vous pouvez confirmer cela en en vérifiant la source .

Ce que vous faites est un peu étrange, mais cela a du sens. Solution intelligente mais je ne pense pas que c'était prévu. Le problème que vous avez semble être avec cette ligne:

http://core.trac.wordpress.org/browser/tags/3.5/wp-includes/default-widgets.php#L574

<a href="<?php the_permalink() ?>" title="<?php echo esc_attr( get_the_title() ? get_the_title() : get_the_ID() ); ?>"><?php if> (get_the_title() ) the_title(); else the_ID(); ?></a>

Et il n'y a pas de crochet qui vous aidera. Le widget saisit le titre avec get_the_title et ne le transmet pas à quoi que ce soit que vous puissiez manipuler.

Je pense que vous devrez peut-être repenser votre approche.

  1. Si vous pouvez modifier le thème dans cette situation, vous pouvez supprimer votre filtre avant que les barres latérales ne soient exécutées et le rajouter ultérieurement. Je pense que c'est la façon la plus simple de le faire mais peut-être que ce n'est pas possible dans votre cas.

  2. Vous pouvez également écrire votre propre widget de publications récentes.

  3. Vous pouvez manipuler vos polices avec Javascript - vous n'êtes pas sûr que ce soit assez robuste pour vous.

Vous pourrez peut-être rechercher une variable $instance dans votre filtre et déterminer si vous utilisez ou non un widget.

add_filter( 'the_title', 'addThemSpans');
function addThemSpans($theTitle) {
  global $instance;
  var_dump($instance); // see if this works.
  // functionality to add span tags to $theTitle so that a title that looks like this...
    // LatinTextHere ကကကကက​ MoreLatinText
  // becomes this...
    // LatinTextHere <span class="myText">ကကကကက</span> MoreLatinText
    // in the final output.
  return $theModifiedTitle;
}

Je ne sais pas si cela fonctionnera ou non, mais si cela vous donnera quelque chose à activer, vous ne devrez pas modifier le thème. Edit: Testé. Malheureusement, ça ne marche pas.

1
s_ha_dum

Vous pouvez les reconvertir simplement en utilisant htmlspecialchars() , qui est une fonction native PHP.

Du manuel:

Les traductions effectuées sont:

  • '&' (esperluette) devient '&amp;'
  • '"' (guillemet double) devient '&quot;' lorsque ENT_NOQUOTES n'est pas défini.
  • "'" (guillemet simple) devient '&#039;' (ou &apos;) uniquement lorsque ENT_QUOTES est défini.
  • '<' (inférieur à) devient '&lt;'
  • '>' (supérieur à) devient '&gt;'

Quoi qu'il en soit, je ne le ferais pas si vous ne connaissez pas chaque utilisateur personnellement (et savez qu'ils se soucient de la sécurité Internet et ne réutilisent pas les mots de passe) ou que c'est uniquement pour vous-même. Lorsque vous reconvertissez ces caractères, vous n'êtes pas sauvegardé si quelqu'un échappe à votre chaîne et fait des trucs géniaux dans votre installation.

0
kaiser