web-dev-qa-db-fra.com

Charger un modèle de page avec un contenu personnalisé à l'aide d'un plugin

Je souhaite charger le modèle page.php avec le contenu que je spécifie (à l'aide de variables et non de la base de données) si la demande contient une chaîne de requête particulière.

Supposons donc qu'un utilisateur demande example.com/?var1=str1 le modèle de page doit être affiché avec le titre et le contenu que je spécifie à l'aide de variables.

C'est le pseudo code de ce que j'essaie de réaliser

<?php
function my_page_function() {
if($_REQUEST['var1'] == "str1")
{
$title="This will be the title of the default page template";
$content="This content will be displayed on the default page template.";
//Load the page.php here with the title and content specified in the variables above
}
}
add_action("template_redirect","my_page_function");
?>

Je souhaite utiliser ce code dans un plugin, il devrait donc fonctionner avec n'importe quel thème page.php.

2
A.Jesin

Vous pouvez y parvenir avec des filtres sur the_content et the_title :

function wpa_content_filter( $content ) {
    if( isset( $_REQUEST['var1'] ) && $_REQUEST['var1'] == "str1" ) {
        return 'This content will be displayed on the default page template.';
    }
    return $content;
}
add_filter( 'the_content', 'wpa_content_filter', 999 );
3
Milo

Créez le fichier de modèle dans votre plug-in, par exemple. template-pluginname.php, puis connectez-vous à template_include et dites à WordPress de l'utiliser:

function wpse114181_template_include( $template ) {
    return ( '' != get_query_var( 'plugin_key' ) ? plugin_dir_path( __FILE__ ) . 'template-plugin.php' : $template );
}
add_filter( 'template_include', 'wpse114181_template_include' );

Remarque: ceci nécessite que vous enregistriez votre variable de requête en utilisant add_query_arg() , mais il est plus sûr que de compter directement sur $_REQUEST.

Modifier

Basé sur ce commentaire:

Le seul problème avec ce code est que, comme je l'ai dit plus tôt, je souhaite que le plug-in fonctionne correctement avec n'importe quel thème. Donc, si je conçois moi-même un fichier modèle, il ne ressemblerait pas au page.php du thème actuellement activé

Si vous souhaitez absolument remplacer le titre et le contenu du message, vous pouvez utiliser les filtres the_title et the_content:

function wpse114181_filter_the_title( $title ) {
    if ( is_page() && '' != get_query_var( 'plugin_key' ) ) {
        return 'Your Post Title Here';
    } else {
        return $title;
    }
}
add_filter( 'the_title', 'wpse114181_filter_the_title' );

function wpse114181_filter_the_content( $content ) {
    if ( is_page() && '' != get_query_var( 'plugin_key' ) ) {
        return 'Your Post Content Here';
    } else {
        return $content;
    }
}
add_filter( 'the_content', 'wpse114181_filter_the_content' );
2
Chip Bennett