WordPress : Problème d’utilisation de remove_filter pour remplacer la fonction dans le thème parent

Publié par Jean-Michel le

J’ai du mal à utiliser remove_filterpour remplacer les liens Lire plus dans mon thème parent.

Voici les fonctions du thème parent :

/* Modify the '[...]' Read More Text */
add_filter( 'the_content_more_link', 'hoot_modify_read_more_link' );
if ( apply_filters( 'hoot_force_excerpt_readmore', true ) ) {
    add_filter( 'excerpt_more', 'hoot_insert_excerpt_readmore_quicktag', 11 );
    add_filter( 'wp_trim_excerpt', 'hoot_replace_excerpt_readmore_quicktag', 11, 2 );
} else {
    add_filter( 'excerpt_more', 'hoot_modify_read_more_link' );
}

/**
 * Modify the '[...]' Read More Text
 *
 * @since 1.0
 * @access public
 * @return string
 */
function hoot_modify_read_more_link( $more = '[…]' ) {
    if ( is_admin() )
        return $more;

    $read_more = esc_html( hoot_get_mod('read_more') );
    $read_more = ( empty( $read_more ) ) ? sprintf( __( 'Read More %s', 'brigsby' ), '→' ) : $read_more;
    global $post;
    $read_more = '<a class="more-link" href="' . esc_url( get_permalink( $post->ID ) ) . '">' . $read_more . '</a>';
    return apply_filters( 'hoot_readmore', $read_more ) ;

}

Et voici mes fonctions dans le fichier function.php de mon thème enfant :

function dw_remove_parent_read_more() {
    remove_filter('excerpt_more', 'hoot_modify_read_more_link');
}
add_action('after_setup_theme', 'dw_remove_parent_read_more',999);

function dw_modify_read_more_link($more = '[&hellip;]') {

    if ( is_admin() )
        return $more;

    $read_more = esc_html( hoot_get_mod('read_more') );
    $read_more = ( empty( $read_more ) ) ? sprintf( __( 'Read More %s', 'brigsby' ), '' ) : $read_more;
    global $post;
    $read_more = '<div><a class="more-link" href="' . esc_url( get_permalink( $post->ID ) ) . '">' . $read_more . '</a></div>';
    return apply_filters( 'hoot_readmore', $read_more ) ;
}
add_filter('excerpt_more', 'dw_modify_read_more_link', 999);

Le résultat actuel est que deux liens de lecture supplémentaires sont maintenant affichés, à la fois celui du thème parent et celui de mon thème enfant. Qu’est-ce que je fais mal 🙂 ?

Solution n°1 trouvée

J’ai compris que le lien « En savoir plus » affiché provenait du wp_trim_excerptcrochet plutôt que du excerpt_morecrochet. Juste besoin de changer mon add_filteret remove_filterde référencer les crochets appropriés.

function dw_remove_parent_read_more() {
    remove_filter('wp_trim_excerpt', 'hoot_replace_excerpt_readmore_quicktag', 11, 2);
}
add_action('after_setup_theme', 'dw_remove_parent_read_more',11);

function dw_replace_excerpt_readmore_quicktag( $text, $raw_excerpt ) {
    if ( is_admin() )
        return $text;
    $read_more = dw_modify_read_more_link();
    $text = str_replace( '<!--hoot-read-more-quicktag-->', '', $text );
    return $text . $read_more ;
}

add_filter('wp_trim_excerpt', 'dw_replace_excerpt_readmore_quicktag', 11,2);

Solution n°2 trouvée

Une note sur les priorités

Notez que si vous essayez de supprimer une fonction à l’aide remove_action()de ou remove_filter()et qu’une priorité lui a été attribuée, vous devez inclure la priorité lors de la suppression, sinon cela ne fonctionnera pas.

Donc, si la fonction dans le thème parent ressemble à ceci :

<?php
function parent_function() {
    // Contents for your function here.
}
add_action( 'init', 'parent_function', 15 );
?>
<?php
function child_remove_parent_function() {
    remove_action( 'widgets_init', 'parent_function', 15 );
}
add_action( 'wp_loaded', 'child_remove_parent_function' );
?>
.

vous devrez inclure la même valeur de priorité lors de sa suppression :

Catégories : Wordpress

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *