Includere un file PHP esterno in un Template Personalizzato di WordPress
È possibile includere un file PHP esterno in un template personalizzato?
Sto cercando di aggiungere un blog nel mio sito. Ho già il layout di header, footer e sidebar nel mio sito. Posso utilizzarli nel mio template personalizzato?
<?php
/*
Template Name: Blog
*/
?>
<?php include( PATH . 'http://www.example.com/includes/header.php' ); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div <?php post_class() ?> id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink() ?>">
<?php the_title(); ?>
</a></h2>
<?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
<div class="entry">
<?php the_content(); ?>
</div>
<div class="postmetadata">
<?php the_tags('Tags: ', ', ', '<br />'); ?>
Pubblicato in
<?php the_category(', ') ?>
|
<?php comments_popup_link('Nessun Commento »', '1 Commento »', '% Commenti »'); ?>
</div>
</div>
<?php endwhile; ?>
<div class="mypagination">
<?php include (TEMPLATEPATH . '/inc/nav.php' ); ?>
</div>
<?php else : ?>
<h2>Non Trovato</h2>
<?php endif; ?>
<?php include( PATH . 'http://www.example.com/includes/sidebar.php' ); ?>
<?php include( PATH . 'http://www.example.com/includes/footer.php' ); ?>
Ho anche provato:
<?php include('http://mywebsite.com/includes/header.php'); ?>

No, non puoi includere file PHP in un tema nel modo che hai indicato.
Per capire perché, basta applicare un po' di buon senso e pensiero critico di base:
- Staresti facendo una richiesta remota a un server remoto
include
non può fare questo - Se per qualche miracolo funzionasse, avresti un grave problema di sicurezza perché potrei fare qualcosa come:
include( 'http://yoursite/wp-config.php' ); echo DB_PASSWORD;
. Immagina quanto sarebbe facile hackerare i siti web! Cosa mi impedirebbe di includerefacebook.com/index.php
? - Anche se funzionasse in qualche modo, e fosse sicuro, immagina la lentezza! Fai una richiesta al server, e poi il server ne fa un'altra per l'header, un'altra per la sidebar, un'altra per il footer, tutta quell'attesa, chi avrebbe la pazienza?
- Ma infine, anche se include potesse fare richieste remote. Cosa che non può, perché dovrebbe restituire codice PHP? Non restituirebbe quello che il server restituisce, cioè l'html finale? Il server esegue qualsiasi PHP prima che venga restituito, quindi non ci sarebbe PHP in quello che includi..
Quindi no, non è possibile. Ma un rapido copia e incolla del codice nella tua domanda in uno script PHP seguito da una rapida visita ti avrebbe detto questo più velocemente di chiunque qui.
Invece, puoi includere solo file dal file system locale su cui il tuo server è in esecuzione. Non dovresti mai passare un URL a un'istruzione include o require.
Quindi se sono in index.php, e c'è un file nella stessa cartella chiamato sidebar.php, lo includerei così:
include('sidebar.php');
include
restituisce un valore se fallisce. La semantica dell'istruzione include è PHP di base generale ed è fuori tema su questo sito di domande e risposte.
Tuttavia ho tenuto aperta questa domanda perché c'è una funzione API di WordPress che dovresti usare invece ed è migliore di include e require per quello che ti serve.
Per includere una parte di template in un tema, usa:
get_template_part( 'partname' );
Questa funzione cercherà anche all'interno di un tema figlio o genitore la parte che hai specificato.
Ad esempio, in questo codice:
get_template_part( 'sidebar', 'first' );
Cercherà e includerà il primo che trova tra questi:
- tema figlio
sidebar-first.php
- tema genitore
sidebar-first.php
- tema figlio
sidebar.php
- tema genitore
sidebar.php
Va notato che dovresti usare get_template_part solo per includere file di template. Non usarlo per includere file come librerie o altri file PHP che non generano html.
Suggerisco di leggere i seguenti argomenti prima di continuare:
- le funzioni include e require su PHP.Net
- temi genitore e figlio
- la gerarchia dei template e come WordPress sceglie quale template usare
<?php php ?> <?php tag ?> <?php spam ?> <?php and ?> <?php why ?> <?php its ?> <?php bad ?>
get_template_part
- l'API
WP_HTTP
, per quelle volte in cui hai davvero bisogno di fare una richiesta remota a un'API. Funzioni comewp_remote_get
ewp_remote_post
ti aiuteranno qui. - Debugging PHP. Le tue pagine bianche sono errori fatali PHP, ma poiché hai la registrazione degli errori impostata per nasconderli al front end, vengono registrati in un file di log degli errori di cui non sei a conoscenza. Trova il tuo log degli errori, definisci
WP_DEBUG
nel tuowp-config.php
e installa un plugin come debug bar o query monitor, questi ti aiuteranno enormemente. Assicurati di chiamarewp_footer
nel footer dei tuoi template però.

supponi di avere questo scenario:
La tua installazione WordPress è ospitata nella cartella root 'www' come tuo sito, e il tuo header.php si trova nella cartella 'www/includes'.
Nel tuo tema WordPress, aggiungi semplicemente
<?php
include('includes/header.php');
?>
Quando WordPress legge i file del tema, utilizza il percorso root.

Non puoi includere una risorsa esterna nelle funzioni include()
! Include lavora con percorsi interni al server. Non puoi includere un url come desideri. È un problema di sicurezza PHP!
Puoi usare:
get_file_contents('http://your.url');
oppure usare una libreria Curl.

Quando ho controllato i file core ho trovato il seguente codice
nel file wp/wp-includes/general-template.php
per la funzione get_header()
Ho trovato le seguenti righe
$templates[] = 'header.php';
locate_template( $templates, true );
Quindi lo sto usando nel mio codice (index.php
) in questo modo
<?php get_header();
$myphpfile[] = 'grid.php';
locate_template( $myphpfile, true );
?>

Potrebbe non essere elegente commentare una domanda così vecchia, ma recentemente ho dovuto fare qualcosa di simile e ho trovato questo risultato utilizzando un metodo non mostrato qui. Lo annoto per i futuri esploratori ;).
Il mio caso d'uso era:
- Wordpress installato in una sottodirectory
- Volevo includere elementi di header/footer dal sito principale, invece di usare Wordpress per questi elementi
Dato che include()
o require()
possono utilizzare percorsi assoluti del server (es: /var/www/vhosts/foo.bar/httpdocs/includes/baz.php
), possiamo usare la definizione ABSPATH
di Wordpress per generare questo:
include( dirname( ABSPATH ) . '/includes/header.php' );
questo restituirà /var/www/vhosts/foo.bar/httpdocs/includes/baz.php
.
Anche quando Wordpress è in una sottodirectory (es: /var/www/vhosts/foo.bar/httpdocs/blog/
), dirname( ABSPATH )
ci dà comunque la root del documento.
Potrebbero esserci altri modi per fare questo, usando ad esempio il superglobale $_SERVER['DOCUMENT_ROOT']
, ma non ho esplorato quella strada.
