web-dev-qa-db-fra.com

Comment puis-je attacher un fichier php à un slug arbitraire et toujours avoir accès aux fonctions wp-core?

Basé sur un exemple trouvé ici et plusieurs autres, j'essaye de charger une page non wordpress à partir d'une URL spécifique tout en ayant accès au noyau wordpress.

J'ai le code suivant (qui semble fonctionner comme prévu) à connecter à l'action template_redirect:

function templateRedirect() {
    global $wp;
    if ( $wp->query_vars['pagename'] == 'nlm-admin-thumbnail' ) {
        global $wp_query;
        // if we have a 404 status
        if ($wp_query->is_404) {
            // set status of 404 to false
            $wp_query->is_404 = false;
            $wp_query->is_archive = true;
        }
        // change the header to 200 OK

        header("HTTP/1.1 200 OK");
        //load our template
        include( dirname( __FILE__ ) . '/thumbnail.php' );
        exit;
    }
}

add_action('template_redirect', 'templateRedirect');

Mon problème vient lors de l'exécution du code dans thumbnail.php. Ce fichier est censé télécharger une vignette d'une page Web et générer l'image brute. Le slug nlm-admin-thumbnail est utilisé comme src pour une balise d'image.

Lorsque j'exécute le fichier thumbnail.php, je continue à recevoir undefined function some_wp_function(). J'ai inclus http.php et class-http.php à partir du dossier wp-includes. Maintenant que j'ai inclus ceux-ci, l'erreur suivante est undefined function apply_filters().

Le chargement d'un fichier php de cette façon ne me donne pas accès au noyau wp, et devrait apply_filers () non accessible?

1
Chris Strutton

Je le fais assez régulièrement et je n’ai aucun problème à utiliser les fonctions de base de WordPress. Vous pouvez toutefois accrocher un peu plus tôt et ignorer les bits 404 et d’en-tête. Dans functions.php:

function wpa88013_parse_query( $wp ){
    if ( 'nlm-admin-thumbnail' == $wp->query_vars['pagename'] ) {
        include( dirname( __FILE__ ) . '/thumbnail.php' );
        exit;
    }
}
add_action( 'parse_query', 'wpa88013_parse_query' );

Et quelques exemples de code dans thumbnail.php:

<?php
$content = "foo\n\nbar";
echo apply_filters( 'the_content', $content );

$post_id = 1;
echo get_the_post_thumbnail( $post_id );

Je viens de tester cela dans le thème vingt-douze et cela fonctionne comme prévu.

2
Milo