Incluir un archivo PHP externo en una plantilla personalizada de Wordpress
¿Es posible incluir un archivo PHP externo en una plantilla personalizada?
Estoy intentando añadir un blog a mi sitio. Ya tengo el diseño de cabecera, pie de página y barra lateral en mi sitio. ¿Puedo usar esos elementos en mi plantilla personalizada?
<?php
/*
Plantilla: 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('Etiquetas: ', ', ', '<br />'); ?>
Publicado en
<?php the_category(', ') ?>
|
<?php comments_popup_link('Sin Comentarios »', '1 Comentario »', '% Comentarios »'); ?>
</div>
</div>
<?php endwhile; ?>
<div class="mypagination">
<?php include (TEMPLATEPATH . '/inc/nav.php' ); ?>
</div>
<?php else : ?>
<h2>No encontrado</h2>
<?php endif; ?>
<?php include( PATH . 'http://www.example.com/includes/sidebar.php' ); ?>
<?php include( PATH . 'http://www.example.com/includes/footer.php' ); ?>
También probé:
<?php include('http://miweb.com/includes/header.php'); ?>

No, no puedes incluir archivos PHP en un tema de la forma que indicaste.
Para entender por qué, solo tenemos que aplicar un poco de sentido común y pensamiento crítico básico:
- Estarías haciendo una solicitud remota a un servidor remoto
include
no puede hacer esto - Si por algún milagro funcionara, tendrías una gran vulnerabilidad de seguridad, ya que podría hacer algo como esto:
include( 'http://tusitio/wp-config.php' ); echo DB_PASSWORD;
. ¡Imagina lo fácil que sería hackear sitios web! ¿Qué me impediría incluirfacebook.com/index.php
? - Incluso si de alguna manera funcionara y fuera seguro, ¡imagina la lentitud! Haces una solicitud al servidor, y luego el servidor hace otra para el encabezado, otra para la barra lateral, otra para el pie de página, todo ese tiempo de espera, ¿quién tendría paciencia?
- Pero finalmente, incluso si
include
pudiera hacer solicitudes remotas. Lo cual no puede, ¿por qué devolvería código PHP? ¿No devolvería lo que el servidor genera, es decir, el HTML finalizado? El servidor ejecuta cualquier PHP antes de devolverlo, por lo que no habría PHP en lo que estás incluyendo.
Así que no, no es posible. Pero un simple copiar y pegar del código de tu pregunta en un script PHP seguido de una visita rápida te lo habría dicho más rápido que cualquier persona aquí.
En cambio, solo puedes incluir archivos del sistema de archivos local en el que se está ejecutando tu servidor. Nunca pasarías una URL a una declaración include
o require
.
Entonces, si estoy en index.php
, y hay un archivo en la misma carpeta llamado sidebar.php
, lo incluiría así:
include('sidebar.php');
include
devuelve un valor si falla. La semántica de la declaración include
es PHP básico general y está fuera de tema en este sitio de preguntas y respuestas.
Sin embargo, mantuve esta pregunta abierta porque hay una función de la API de WordPress que deberías usar en su lugar, que es mejor que include
y require
para lo que necesitas.
Para incluir una parte de plantilla en un tema, usa:
get_template_part( 'nombreparte' );
Esta función también buscará dentro de un tema hijo o padre la parte que especificaste.
Por ejemplo, en este código:
get_template_part( 'sidebar', 'first' );
Buscará e incluirá el primero que encuentre de estos:
- tema hijo
sidebar-first.php
- tema padre
sidebar-first.php
- tema hijo
sidebar.php
- tema padre
sidebar.php
Debe notarse que solo debes usar get_template_part
para incluir archivos de plantilla. No lo uses para incluir archivos como bibliotecas u otros archivos PHP que no generen HTML.
Sugiero que leas sobre los siguientes temas antes de continuar:
- las funciones
include
yrequire
en PHP.Net - temas padre e hijo
- la jerarquía de plantillas y cómo WordPress elige qué plantilla usar
<?php php ?> <?php tag ?> <?php spam ?> <?php and ?> <?php why ?> <?php its ?> <?php bad ?>
get_template_part
- la API
WP_HTTP
, para esos momentos genuinos en los que realmente necesitas hacer una solicitud remota a una API. Funciones comowp_remote_get
ywp_remote_post
te ayudarán aquí. - Depuración en PHP. Tus páginas en blanco son errores fatales de PHP, pero debido a que tienes el registro de errores configurado para ocultarlo en el front-end, se está registrando en un archivo de registro de errores del que no eres consciente. Encuentra tu registro de errores, define
WP_DEBUG
en tuwp-config.php
e instala un plugin como Debug Bar o Query Monitor, estos te ayudarán enormemente. Asegúrate de llamar awp_footer
en el pie de página de tus plantillas.

Supongamos que tienes este escenario:
Tu instalación de WordPress está alojada en la carpeta raíz 'www' como tu sitio, y tu archivo header.php está en la carpeta 'www/includes'.
En tu tema de WordPress, simplemente añade:
<?php include('includes/header.php'); ?>
Cuando WordPress lee los archivos del tema, utiliza la ruta raíz.

¡No puedes incluir un recurso externo en las funciones include()
! Include funciona con rutas internas del servidor. No puedes incluir una URL como desees. ¡Es un problema de seguridad en PHP!
Puedes usar:
file_get_contents('http://tu.url');
o utilizar una biblioteca Curl.

Cuando revisé los archivos principales, encontré el siguiente código en el archivo wp/wp-includes/general-template.php
para la función get_header()
Encontré las siguientes líneas:
$templates[] = 'header.php';
locate_template( $templates, true );
Así que lo estoy usando en mi código (index.php
) de esta manera:
<?php get_header();
$myphpfile[] = 'grid.php';
locate_template( $myphpfile, true );
?>

Puede que sea de mala educación publicar en una pregunta tan antigua, pero recientemente tuve que hacer algo similar y encontré este resultado usando un método que no se muestra aquí. Lo anoto para futuros exploradores ;).
Mi caso de uso fue:
- Wordpress instalado en un subdirectorio
- Quería incluir elementos de header/footer del sitio padre, en lugar de usar Wordpress para estos elementos
Debido a que include()
o require()
pueden usar rutas absolutas del servidor (ej: /var/www/vhosts/foo.bar/httpdocs/includes/baz.php
), podemos usar la definición ABSPATH
de Wordpress para generarlo:
include( dirname( ABSPATH ) . '/includes/header.php' );
esto retornará /var/www/vhosts/foo.bar/httpdocs/includes/baz.php
.
Incluso cuando Wordpress está en un subdirectorio (ej: /var/www/vhosts/foo.bar/httpdocs/blog/
), dirname( ABSPATH )
nos da el document root sin problema.
Puede haber otras formas de hacer esto, usando por ejemplo el superglobal $_SERVER['DOCUMENT_ROOT']
, pero no exploré esa opción.
