web-dev-qa-db-fra.com

Écraser ou remplacer le code dans WP_Footer

J'ai un code ajouté dynamiquement dans mon pied de page via add_action('wp_footer' ...). Malheureusement, je ne suis pas sûr de savoir comment le supprimer en utilisant des méthodes conventionnelles. J'ai examiné la question suivante et essayé d'utiliser les solutions proposées:

remove_action ou remove_filter avec des classes externes?

Mais je n’avais aucune chance avec aucune des réponses alors je cherche maintenant des alternatives . Existe-t-il un moyen d'exécuter une sorte de preg_replace sur le contenu de wp_footer()? Existe-t-il d'autres moyens de supprimer des éléments dans wp_footer sans utiliser remove_action()?

Plus d'informations:

Le plugin a un fichier de sortie . Sur la ligne 697 est l'endroit où l'action est réellement ajoutée:

add_action('wp_footer', array($this, 'add_inline_styles'));

La fonction réelle est définie à la ligne 1743

Je ne savais pas trop s'il fallait faire référence à RevOperations:: ou RevSliderFront:: - Voici le fichier d'installation initial situé à la racine du dossier du plugin.

1
Howdy_McGee

Puisque vous avez exclu remove_action, vous ne pouvez le faire que d'une seule façon. Et vous l'avez deviné: preg_repalce, substr mélange mais avec un peu d'aide et PHP DOM

add_action('wp_footer', 'my_start_footer_ob', 1);
function my_start_footer_ob() {
    ob_start("my_end_footer_ob_callback");
}

add_action('wp_footer', 'my_end_footer_ob', 1000);
function my_end_footer_ob() {
    ob_end_flush();
}

function my_end_footer_ob_callback($buffer) {
    // remove what you need from he buffer

    return $buffer;
}

Dans my_end_footer_ob_callback, vous modifiez le $buffer selon vos besoins. Les paramètres $buffer doivent avoir tout le contenu du pied de page après que toutes les actions et les filtres ont été appelés à l'action. Si cela ne modifie pas simplement 1000 en un nombre plus grand , de sorte que my_end_footer_ob est appelé en dernier.

Maintenant, je ne sais pas quel contenu HTML cette action produit, mais vous pouvez utiliser pre_replace ou une séquence de substrs pour la supprimer.

Si vous voulez utiliser PHP DOM , procédez comme suit:

function my_end_footer_ob_callback($buffer) {
    // remove what you need from he buffer

    $doc = new DOMDocument;
    $doc->loadHTML($buffer);

    $docElem = $doc->getElementById("theID");

    if($docElem !== NULL) // if it exists
        $docElem->parentNode->removeChild($docElem);

    return $doc->getElementsByTagName('body')->firstChild->nodeValue;
}

Dis-moi si ça marche pour toi.

2
aifrim