web-dev-qa-db-fra.com

Comment ajouter au titre via functions.php pour le plugin de publication automatique

Ce que j'ai jusqu'à présent

J'ai enfin le plugin functions.php pour ajouter une chaîne aux titres d'articles d'un type de message personnalisé avec cette fonction:

function append_album_review_to_title( $title ) {
    global $post;
    $text = 'Album Review: ';

    if ( get_post_type( $post->ID ) == 'album_review' && in_the_loop() ){
        return $text . $title;
    }
    else {
        return $title;
    }
}
if(function_exists('add_filter')) {
    add_filter('the_title', 'append_album_review_to_title');
}

et bien que cela fasse presque tout ce dont j'ai besoin, il n'ajoute toujours pas la chaîne aux titres tels qu'ils sont publiés via des plugins de publication automatique.

Le problème

Le plugin que j'utilise est NextScripts: Affiche automatique des réseaux sociaux et partout où je peux voir le titre, la chaîne souhaitée est ajoutée, mais lorsque ce plugin affiche automatiquement , la chaîne n'est pas ajoutée.

La question

Comment puis-je modifier ma fonction pour qu'elle s'applique également aux titres tels qu'ils sont générés par des plugins à publication automatique?


MISE À JOUR 1

Pourquoi in_the_loop()?

J'utilise in_the_loop() parce que si je ne le fais pas, la chaîne est ajoutée apparemment à tous les liens de la page. Je pense que cela peut arriver parce que le post_type auquel j'ajoute est un type personnalisé. Je viens d'essayer de l'enlever, et bien sûr "Album Review:" a été ajouté à chaque lien de la page.

%FULLTITLE% fonctionnera-t-il uniquement avec les <meta>s manuels?

J'ai essayé d'utiliser %FULLTITLE% sans les balises <meta> manuelles comme vous l'avez décrit, mais il ne semble pas que la chaîne soit ajoutée. La raison pour laquelle je me suis donné la peine d'essayer de cette façon, c'est parce que le plug-in YOAST (comme vous l'avez dit) inclut déjà ces balises, mais parce qu'il ajoute déjà "Album Review:" au titre, si nécessaire. Ainsi, lorsque j’inspecte la source, dans le <head>, les balises ressemblent à ceci:

<meta property="og:title" content="Album Review: [the rest of title]">

Les ajouts de YOAST ne suffisent-ils pas et je dois faire les tags manuels?

(Toutes mes excuses pour cette forme de communication; WordPress StackExchange ne me permet toujours pas de commenter ou d’augmenter le vote.)

1
Andre Bulatov

Whoa, ce plugin était un cauchemar à regarder.

Mais j'ai une solution pour vous. Dans la description de vos liens, vous pouvez utiliser l’espace réservé %FULLTITLE% au lieu de %TITLE%. %FULLTITLE% applique les filtres pour le titre.

De nxs_functions_adv.php lignes 19 et 20:

if (preg_match('/%TITLE%/', $msg)) { $title = nxs_doQTrans($post->post_title, $lng); $msg = str_ireplace("%TITLE%", $title, $msg); }                    
if (preg_match('/%FULLTITLE%/', $msg)) { $title = apply_filters('the_title', nxs_doQTrans($post->post_title, $lng));  $msg = str_ireplace("%FULLTITLE%", $title, $msg); }          

Oui, voici comment le code est formaté dans le plugin.

Cela résout votre premier problème.

La prochaine étape consiste à ajouter des informations Open Graph à votre en-tête et à lui appliquer le filtre de titre. Par exemple pour Facebook (original from WPBeginner ):

//Adding the Open Graph in the Language Attributes
function f711_add_opengraph_doctype( $output ) {
    return $output . ' xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml"';
}
add_filter('language_attributes', 'f711_add_opengraph_doctype');

//Lets add Open Graph Meta Info

function f711_insert_fb_in_head() {
    global $post;
    if ( !is_singular()) //if it is not a post or a page
        return;
    echo '<meta property="og:title" content="' . get_the_title() . '"/>';
    echo '<meta property="og:type" content="article"/>';
    echo '<meta property="og:url" content="' . get_permalink() . '"/>';
    echo '<meta property="og:site_name" content="' . get_bloginfo( 'title' ) . '"/>';
    if(!has_post_thumbnail( $post->ID )) { //the post does not have featured image, use a default image
        $default_image="http://example.com/image.jpg"; //replace this with a default image on your server or an image in your media library
        echo '<meta property="og:image" content="' . $default_image . '"/>';
    }
    else{
        $thumbnail_src = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'medium' );
        echo '<meta property="og:image" content="' . esc_attr( $thumbnail_src[0] ) . '"/>';
    }
    echo "
";
}
add_action( 'wp_head', 'f711_insert_fb_in_head', 5 );

IMPORTANT assurez-vous de ne pas inclure cette information. Par exemple, YOAST SEO le fait - et cela pourrait être déroutant pour Facebook. Ils utilisent cette information comme titre de leurs boîtes à liens.

Enfin, je suggérerais une modification de votre fonction: perdez la in_the_loop() pour permettre l’application du filtre partout. De plus, comme @PieterGoosen l'a souligné, j'ai ignoré la vérification inutile de function_exists().

function append_album_review_to_title( $title ) {

    global $post;
    $text = 'Album Review: ';

    if ( get_post_type( $post->ID ) == 'album_review' ){
        return $text . $title;
    } else {
        return $title;
    }

}
add_filter('the_title', 'append_album_review_to_title');
1
fischi