2010-08-10 13 views
1

Je travaille sur un plugin wordpress qui modifie le titre d'un post. Je veux seulement faire ceci quand je regarde un seul article. Pour être précis, je veux ajouter un lien à côté du titre, mais pour les fins de la question, je vais ajouter un texte arbitraire. J'ai commencé par utiliser le hook du filtre 'the_title' et j'ai appelé cette fonction.le titre de ciblage dans le post wordpress

function add_button_to_title($title) 
{ 
    global $post; 
    if(is_single()) 
    { 
    return $title.'googly googly'; 
    } 
    return $title; 
} 

Le problème est, les liens sur la barre latérale apparemment utiliser aussi « the_title », comme je l'ai vu mon texte montrant dans les barres latérales et, ce qui m'a amené à:

if(is_single() && in_the_loop()) 

Mais alors, dans mon thème (et je suppose que les thèmes en général) il y a un lien vers le post précédent et le post suivant, qui utilise aussi le filtre 'title'. Donc finalement je:

if(is_single() && in_the_loop() && ($post->post_title == $title)) 

La dernière condition fait essentiellement assurer qu'il est le titre du poste qui est en cours d'impression, pas le titre du poste suivant ou précédent. Cela fonctionne mais je ne suis pas sûr à quel point cela fonctionnera selon différents thèmes ... Cela semble terriblement piraté ensemble. Des conseils de gourous wordpress là-bas? Je crains que le titre ne soit modifié pour d'autres raisons et que le conditionnel échouera.

Toute aide est appréciée!

+0

Peut-être qu'il est plus sûr de comparer l'identifiant de poste (passé comme second argument aux filtres 'the_title'. Si un autre filtre avant modifie le titre, je pense que le titre passé peut ne pas correspondre au titre après la base de données, –

+0

salut jan, ce serait une bonne solution, si je pouvais trouver quel hook était responsable de la sortie des ids. Quand le titre est sorti, le filtre 'the_title()' – Ying

Répondre

0

Ne serait-il pas plus facile de conserver la version originale de votre fonction add_button_to_title, mais au lieu de l'accrocher à un filtre, appelez-le directement depuis votre page single.php à l'endroit approprié?

Par exemple, quelque part dans single.php de votre thème, au lieu de ceci:

<h3 class="storytitle"> 
    <a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a> 
</h3> 

Utilisez ceci:

<h3 class="storytitle"> 
    <a href="<?php the_permalink() ?>" rel="bookmark"> 
     <?php echo add_button_to_title(the_title('', '', false); ?> 
    </a> 
</h3> 
+0

Ce n'est pas vraiment une bonne solution car il s'agira d'un plugin, pas d'une modification de thème, ce qui signifie qu'il n'y a pas d'accès aux fichiers de thème depuis le plugin, donc Ying a besoin d'un plugin. solution qui fonctionnera presque partout sans modification du fichier –

+0

yeap, c'est ce que j'ai fait initialement pour bootstrap. Comme John l'a souligné, je veux qu'il soit en mesure d'atteindre un large public qui devrait juste être capable de le 'brancher'. Merci pour la contribution bien! – Ying

2

Ying,

Il n'y a pas vraiment une bonne solution, sauf, comme l'a dit ShaderOp, nécessitant une modification du thème. Votre solution fonctionnera pour la plupart. La seule exception est si le développeur de thème a modifié la requête dans une page. Je dirais que c'est probablement une solution assez bonne pour couvrir plus de 95% des cas que vous rencontrerez.

2

J'ai résolu un problème similaire en ajoutant une vérification pour voir si le titre filtré correspond au titre de la publication. Cela évite le problème avec d'autres titres de poste sur la page (dans la barre latérale, menu) également filtré.

function add_button_to_title($title) { 
    global $post; 
    if(is_single() && $title == $post->post_title) { 
    return $title . 'googly googly'; 
    } else { 
    return $title; 
    } 
} 
+0

Quel filtre avez-vous utilisé? – Brad

0

Aujourd'hui, j'ai rencontré un problème similaire. Le titre est appelé plusieurs fois sur toute la page (par exemple, dans la tête html, les menus, la barre latérale). J'ai suivi une approche similaire en utilisant des conditions et l'id de poste/page.

De plus, j'ai ajouté un indicateur booléen qui est mis à true en utilisant le filtre 'the_content'. Le titre est donc modifié jusqu'à ce que le contenu soit affiché. De cette façon, je m'assure que les sidebars/widgets ne sont pas affectés (par exemple Thème Thématique a un widget par défaut avec des liens vers les pages - ici les autres conditions ne seraient pas utiles car get_the_id() retournerait un équivalent). Cela fonctionne UNIQUEMENT si le thème utilise des barres latérales sur la droite. Je n'ai pas encore trouvé de moyen de me connecter directement avant l'appel 'the_title' de la page/post pour activer le drapeau booléen.

function myplugin_adjust_title($title, $id) { 
    global $myplugin_title_changed; 

    if ($myplugin_title_changed) { 
     return $title; 
    } 

    if (in_the_loop() && is_page('myplugin') && $id == get_the_ID()) { 
     $title = ''; 
    } 
    return $title; 
} 
add_filter('the_title', 'myplugin_adjust_title', 10, 2); 

function myplugin_adjust_title_helper_content($content) { 
    global $myplugin_title_changed; 
    $myplugin_title_changed = true; 
    return $content; 
} 
add_filter('the_content', 'myplugin_adjust_title_helper_content'); 
+0

"Barre latérale droite" est trompeuse. Vous voulez dire que cela ne fonctionne que si la barre latérale est appelée APRÈS le contenu de la page/post dans le code (les barres latérales sur la droite pourraient effectivement être appelées AVANT le contenu de la page/post). –