Includerea unui fișier PHP extern într-un șablon personalizat WordPress
Este posibil să includem un fișier PHP extern într-un șablon personalizat?
Încerc să adaug un blog în site-ul meu. Am deja layout-ul pentru header, footer și sidebar în site. Pot folosi aceste elemente în șablonul meu personalizat?
<?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('Etichete: ', ', ', '<br />'); ?>
Publicat în
<?php the_category(', ') ?>
|
<?php comments_popup_link('Fără comentarii »', '1 Comentariu »', '% Comentarii »'); ?>
</div>
</div>
<?php endwhile; ?>
<div class="mypagination">
<?php include (TEMPLATEPATH . '/inc/nav.php' ); ?>
</div>
<?php else : ?>
<h2>Nu a fost găsit</h2>
<?php endif; ?>
<?php include( PATH . 'http://www.example.com/includes/sidebar.php' ); ?>
<?php include( PATH . 'http://www.example.com/includes/footer.php' ); ?>
Am încercat și:
<?php include('http://mywebsite.com/includes/header.php'); ?>

Nu, nu poți include fișiere PHP într-o temă în modul indicat de tine.
Pentru a înțelege de ce, trebuie doar să aplicăm puțină logică și gândire critică:
- Ai face o solicitare la distanță către un server la distanță, iar funcția
include
nu poate face acest lucru - Dacă prin vreun miracol ar funcționa, ai avea o mare vulnerabilitate de securitate, deoarece aș putea face ceva de genul:
include( 'http://siteultau/wp-config.php' ); echo DB_PASSWORD;
. Îți poți imagina cât de ușor ar fi să hack-uiți site-uri! Ce mă oprește să includfacebook.com/index.php
? - Chiar dacă ar funcționa cumva și ar fi sigur, gândește-te la încetinirea pe care o provoacă! Faci o cerere către server, apoi serverul face altă cerere pentru header, altă pentru sidebar, altă pentru footer - toate astea în așteptare, cine ar avea răbdare?
- Și în final, chiar dacă
include
ar putea face cereri la distanță (ceea ce nu poate), de ce ar returna cod PHP? Nu ar returna ceea ce serverul trimite înapoi, adică HTML-ul final? Serverul rulează orice PHP înainte de a returna, deci nu ar fi cod PHP în ceea ce incluzi.
Deci nu, nu este posibil. Dar un simplu copy-paste al codului din întrebarea ta într-un script PHP urmat de o vizitare rapidă ți-ar fi spus asta mai repede decât oricine de aici.
În schimb, poți include doar fișiere din sistemul de fișiere local pe care rulează serverul tău. Nu trebuie să transmiți niciodată o URL către o instrucțiune include
sau require
.
De exemplu, dacă sunt în index.php și există un fișier în același director numit sidebar.php, l-aș include astfel:
include('sidebar.php');
include
returnează o valoare dacă operațiunea eșuează. Semantica instrucțiunii include
face parte din PHP de bază și este în afara subiectului acestui site de întrebări și răspunsuri.
Totuși, am păstrat această întrebare deschisă pentru că există o funcție API WordPress pe care ar trebui să o folosești în loc, care este mai bună decât include
și require
pentru ceea ce ai nevoie.
Pentru a include o parte de template într-o temă, folosește:
get_template_part( 'partname' );
Această funcție va căuta partea specificată atât în tema copil cât și în tema părinte.
De exemplu, în acest cod:
get_template_part( 'sidebar', 'first' );
Va căuta și va include primul fișier găsit dintre următoarele:
- tema copil
sidebar-first.php
- tema părinte
sidebar-first.php
- tema copil
sidebar.php
- tema părinte
sidebar.php
Este important de menționat că get_template_part
trebuie folosit doar pentru a include fișiere de template. Nu-l folosi pentru a include fișiere precum biblioteci sau alte fișiere PHP care nu afișează HTML.
Sugerez să citești despre următoarele subiecte înainte de a continua:
- funcțiile
include
șirequire
pe PHP.Net - teme părinte și copil
- ierarhia de template-uri și cum alege WordPress ce template să folosească
<?php php ?> <?php tag ?> <?php spam ?> <?php and ?> <?php why ?> <?php its ?> <?php bad ?>
get_template_part
- API-ul
WP_HTTP
, pentru acele cazuri când chiar ai nevoie să faci o cerere la distanță către un API. Funcții precumwp_remote_get
șiwp_remote_post
te vor ajuta aici. - Depanarea PHP. Paginile albe sunt erori PHP Fatale, dar pentru că ai setat logging-ul de erori să le ascundă în front-end, acestea sunt înregistrate într-un fișier de log de care nu ești conștient. Găsește fișierul tău de log, definește
WP_DEBUG
înwp-config.php
și instalează un plugin precum debug bar sau query monitor - acestea te vor ajuta enorm. Asigură-te că apeleziwp_footer
în footer-ul template-ului tău.

presupunem că ai acest scenariu:
Instalarea ta WordPress este găzduită în folderul root 'www' ca site-ul tău, iar fișierul header.php este în folderul 'www/includes'.
În tema ta WordPress, adaugă doar
<?php
include('includes/header.php');
?>
Când WordPress citește fișierele temei, folosește calea root.

Nu poți include o resursă externă în funcțiile include()
! Include funcționează prin căi interne ale serverului. Nu poți include un URL după cum dorești. Aceasta reprezintă o problemă de securitate în PHP!
Poți folosi:
get_file_contents('http://your.url');
sau să utilizezi o bibliotecă Curl.

Pentru Child Theme:
<?php echo get_stylesheet_directory_uri().'/subfoldername/add.php';?>
Puteți folosi
Pentru Parent Theme: get_template_directory() sau get_template_directory_uri()
Pentru Child Theme: get_stylesheet_directory() sau get_stylesheet_directory_uri()

Când am verificat fișierele de bază, am găsit următorul cod în fișierul wp/wp-includes/general-template.php
pentru funcția get_header()
Am găsit următoarele linii:
$templates[] = 'header.php';
locate_template( $templates, true );
Așadar, folosesc acest cod în fișierul meu (index.php
) astfel:
<?php get_header();
$myphpfile[] = 'grid.php';
locate_template( $myphpfile, true );
?>

Poate nu este cea mai bună practică să postez la o întrebare atât de veche, dar recent am avut nevoie să fac ceva similar și am găsit acest rezultat folosind o metodă care nu este prezentată aici. O notez pentru viitorii exploratori ;).
Cazul meu de utilizare a fost:
- Wordpress instalat într-un subdirector
- Am vrut să includ elemente de footer/header de la site-ul părinte, în loc să folosesc Wordpress pentru aceste elemente
Deoarece include()
sau require()
pot folosi căi absolute pe server (de exemplu: /var/www/vhosts/foo.bar/httpdocs/includes/baz.php
), putem folosi definiția ABSPATH
din Wordpress pentru a genera aceasta:
include( dirname( ABSPATH ) . '/includes/header.php' );
acesta va returna /var/www/vhosts/foo.bar/httpdocs/includes/baz.php
.
Chiar și atunci când Wordpress este într-un subdirector (de exemplu: /var/www/vhosts/foo.bar/httpdocs/blog/
), dirname( ABSPATH )
ne oferă rădăcina documentului indiferent de situație.
Pot exista și alte modalități de a face acest lucru, folosind de exemplu superglobalul $_SERVER['DOCUMENT_ROOT']
, dar nu am explorat această variantă.
