web-dev-qa-db-fra.com

Modifier une fonction sans modifier le modèle

Je me demande comment je peux modifier une fonction sans toucher au fichier modèle.

La fonction suivante est appelée dans mon thème dans le fichier template-functions.php:

    if( ! function_exists( 'book_landing_page_footer_credit' ) ) :
/**
 * Footer Credits 
 */
function book_landing_page_footer_credit(){

    echo '<div class="site-info">';
    esc_html_e( 'Copyright &copy;&nbsp;', 'book-landing-page' ); 
    echo esc_html( date_i18n( 'Y' ) );
    echo ' <a href="' . esc_url( home_url( '/' ) ) . '">' . esc_html( get_bloginfo( 'name' ) ) . '&#46;&nbsp;</a>';
    printf('<a href="%1$s">Book Landing Page By %2$s</a>&#46;&nbsp;', esc_url( __( 'http://raratheme.com/wordpress-themes/book-landing-page/', 'book-landing-page' ) ), 'Rara Theme');
    printf( esc_html__( 'Powered by %s', 'book-landing-page' ), '<a href="'. esc_url( __( 'https://wordpress.org/', 'book-landing-page' ) ) .'" target="_blank">WordPress&#46;</a>' );
    echo '</div>';

}
endif;

Ce qui est référencé dans le fichier template-hooks.php comme ceci:

add_action( 'book_landing_page_footer', 'book_landing_page_footer_credit', 40 );

Ma question est, comment puis-je modifier cette fonction sans toucher les fichiers de modèle?

J'ai essayé ce qui suit mais ça ne marche pas:

if (!function_exists('new_credit')) {
    function new_credit() {
        echo 'This is my site';
    }
    add_filter('book_landing_page_footer_credit', 'new_credit');
}
1
brandozz

Évidemment, vous devrez éditer quelque chose si vous voulez le modifier. Votre meilleure action consiste donc à créer un thème enfant, avec son propre fichier de fonction.

Un filtre, comme vous l'avez essayé, ne fonctionnera pas, car il n'y a pas de crochet de filtre dans la fonction que vous essayez de modifier. Ce que vous pouvez faire, c'est supprimer l'action qui imprime le pied de page, puis ajouter une nouvelle action sur le même point d'ancrage. Comme ça:

add_action ('wp_head','wpse252108_remove_add_action');

function wpse252108_remove_add_action() {
  remove_action ('book_landing_page_footer', 'book_landing_page_footer_credit', 40);
  add_action ('book_landing_page_footer', 'new_credit', 40)
  }

Comme il est difficile de savoir où dans le flux template-hooks.php, l'emplacement où l'action initiale est ajoutée, est chargé, il est possible que wp_head soit trop tôt pour effectuer l'action d'ajout/suppression. wp_footer est peut-être mieux, bien que cela puisse être trop tard.

1
cjbj