Incluir un archivo PHP externo en una plantilla personalizada de Wordpress

26 ago 2013, 10:31:53
Vistas: 88.4K
Votos: 7

¿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 &#187;', '1 Comentario &#187;', '% Comentarios &#187;'); ?>
  </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'); ?>
4
Comentarios

Echa un vistazo a http://codex.wordpress.org/Integrating_WordPress_with_Your_Website debería responder a tu pregunta.

Mark Davidson Mark Davidson
26 ago 2013 10:37:28

Puedes usarlo. ¿Qué problema estás enfrentando?

Vinod Dalvi Vinod Dalvi
26 ago 2013 10:39:35

Hola, acabo de copiar mis archivos dentro de la carpeta de WordPress y los enlacé correctamente... de todos modos, ¿cuál es la respuesta a esta pregunta? Solo obtengo una página en blanco

Jeremi Liwanag Jeremi Liwanag
26 ago 2013 17:07:19

Solo para aclarar, ¿estás intentando incluir archivos que se encuentran en un sitio externo? Si es así, ¿los permisos actuales de los archivos PHP en ese sitio permiten acceso público de lectura a estos archivos?

iyrin iyrin
13 feb 2014 16:08:13
Todas las respuestas a la pregunta 6
0

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:

  1. Estarías haciendo una solicitud remota a un servidor remoto include no puede hacer esto
  2. 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 incluir facebook.com/index.php?
  3. 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?
  4. 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 y require 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 como wp_remote_get y wp_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 tu wp-config.php e instala un plugin como Debug Bar o Query Monitor, estos te ayudarán enormemente. Asegúrate de llamar a wp_footer en el pie de página de tus plantillas.
25 mar 2014 02:31:04
0

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.

13 feb 2014 13:37:39
1

¡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.

3 feb 2014 11:35:08
Comentarios

Por favor, agrega una buena cantidad de explicación a tus respuestas para ayudar al usuario a comprender tu punto.

Maruti Mohanty Maruti Mohanty
3 feb 2014 13:11:50
0

Para temas hijos:

<?php echo get_stylesheet_directory_uri().'/subcarpeta/agregar.php';?>

Puedes usar

Para tema padre: get_template_directory() o get_template_directory_uri()
Para tema hijo: get_stylesheet_directory() o get_stylesheet_directory_uri()
24 abr 2018 16:04:10
0

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 );
?>
12 ene 2017 10:16:29
0

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.

5 may 2020 02:01:48