web-dev-qa-db-fra.com

Inclure un externe PHP déposer dans un modèle personnalisé Wordpress

Est-il possible d'inclure un fichier PHP externe dans un modèle personnalisé?

J'essaie d'ajouter un blog sur mon site. J'ai déjà l'en-tête, le pied de page et la disposition de la barre latérale sur mon site. Puis-je les utiliser dans mon modèle personnalisé?

<?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 />'); ?>
    Posted in
    <?php the_category(', ') ?>
    |
    <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?>
  </div>
</div>
<?php endwhile; ?>
<div class="mypagination">
  <?php include (TEMPLATEPATH . '/inc/nav.php' ); ?>
</div>
<?php else : ?>
<h2>Not Found</h2>
<?php endif; ?>
<?php include( PATH . 'http://www.example.com/includes/sidebar.php' );  ?>
<?php include( PATH . 'http://www.example.com/includes/footer.php' );  ?>

J'ai aussi essayé:

<?php include('http://mywebsite.com/includes/header.php'); ?>
5
Jeremi Liwanag

Non, vous ne pouvez pas inclure les fichiers PHP dans un thème comme vous l'avez indiqué.

Pour voir pourquoi, tout ce que nous avons à faire est d’exercer un sens commun et une pensée critique fondamentale:

  1. Vous feriez une demande à distance à un serveur distant include ne peut pas faire cela
  2. Si par miracle cela fonctionnait, vous auriez un exploit de sécurité majeur car je pourrais alors faire quelque chose comme ceci: include( 'http://yoursite/wp-config.php' ); echo DB_PASSWORD;. Imaginez comme il serait facile de pirater des sites Web! Quoi de m'arrêter, y compris facebook.com/index.php?
  3. Si même alors cela fonctionnait, et que c'était sécurisé, imaginez la lenteur! Vous faites une demande au serveur, puis le serveur en fait une autre pour l'en-tête, une autre pour la barre latérale et une autre pour le pied de page, toute cette attente, qui pourrait être dérangé?
  4. Mais finalement, même si include peut faire des requêtes à distance. Pourquoi ne renvoie-t-il pas le code PHP? Ne renverra-t-il pas ce que le serveur crache, c'est-à-dire le HTML finalisé? Le serveur exécute tout PHP avant qu'il ne soit renvoyé, il n'y aurait donc pas de PHP dans ce que vous incluez ..

Donc non, ce n'est pas possible. Mais un simple copier-coller du code de votre question dans un script PHP suivi d'une visite rapide vous l'aurait dit plus rapidement que quiconque ici.

Au lieu de cela, vous pouvez uniquement inclure des fichiers du système de fichiers local sur lequel votre serveur est actuellement exécuté. Vous ne transmettriez jamais d'URL à une instruction include ou require.

Donc, si je suis dans index.php, et s'il y a un fichier dans le même dossier appelé sidebar.php, je l'inclurais comme ceci:

include('sidebar.php');

include renvoie une valeur si cela a échoué. La sémantique de l'instruction include est une base générale PHP et ne correspond pas au sujet de ce site de questions-réponses.

Cependant, j'ai gardé cette question ouverte car il existe une fonction API WordPress que vous devriez utiliser plutôt que d'inclure et d'exiger ce dont vous avez besoin.

Pour inclure un modèle de pièce dans un thème, utilisez:

get_template_part( 'partname' );

Cette fonction examinera également à l'intérieur d'un thème enfant ou parent la partie que vous avez spécifiée.

Par exemple, dans ce code:

get_template_part( 'sidebar', 'first' );

Il cherchera et inclura le premier qu'il trouve parmi ceux-ci:

  • thème enfant sidebar-first.php
  • thème parent sidebar-first.php
  • thème enfant sidebar.php
  • thème parent sidebar.php

Notez que vous ne devez utiliser que get_template_part pour inclure les fichiers de modèle. Ne l'utilisez pas pour inclure des fichiers tels que des bibliothèques ou d'autres fichiers PHP qui ne génèrent pas le code HTML.

Je vous suggère de lire les sujets suivants avant de continuer:

  • les fonctions include et require sur PHP.Net
  • thèmes parent et enfant
  • la hiérarchie des modèles et comment WordPress choisit le modèle à utiliser
  • <?php php ?> <?php tag ?> <?php spam ?> <?php and ?> <?php why ?> <?php its ?> <?php bad ?>
  • get_template_part
  • l’API WP_HTTP, pour ces moments authentiques, vous devez vraiment faire une demande à distance à une API. Des fonctions telles que wp_remote_get et wp_remote_post seront utiles ici.
  • Débogage PHP. Vos pages blanches sont des erreurs fatales PHP, mais comme vous les avez enregistrées, elles sont enregistrées dans un fichier journal des erreurs dont vous n'êtes pas au courant. Recherchez votre journal des erreurs, définissez WP_DEBUG dans votre wp-config.php et installez un plug-in tel qu'une barre de débogage ou un moniteur de requêtes, ces informations vous aideront énormément. Assurez-vous cependant d'appeler wp_footer dans le pied de page de vos modèles.
7
Tom J Nowell

supposons que vous ayez ce cénario:

Votre instalation wordpress est hébergée sur le dossier racine 'www' en tant que votre site et votre header.php sur le dossier 'www/includes'.

Dans votre thème wordpress, ajoutez simplement

 <? php 
 include ('includes/header.php'); 
?> 

Lorsque WordPress lit les fichiers de thème, il utilise le chemin racine.

2
eduardogoncalves

Vous ne pouvez pas inclure de ressource externe sur les fonctions include()! Inclure les œuvres par les chemins internes du serveur. Vous ne pouvez pas inclure une URL à votre guise. C'est un problème de sécurité PHP!

Vous pouvez utiliser:

get_file_contents('http://your.url'); 

ou utilisez une bibliothèque Curl.

1
Giorgio Tedesco

Quand j'ai vérifié les fichiers de base, voici le code que j'ai trouvé dans le fichier wp/wp-includes/general-template.php pour la fonction get_header()

j'ai trouvé les lignes suivantes

$templates[] = 'header.php';

locate_template( $templates, true );

Je l'utilise donc dans mon code (index.php) comme ceci

<?php get_header();

    $myphpfile[] = 'grid.php';
    locate_template( $myphpfile, true );
?>
0
abdul rashid

Pour le thème de l'enfant:

<?php echo get_stylesheet_directory_uri().'/subfoldername/add.php';?>

Vous pouvez utiliser

For Parent Theme: get_template_directory() or get_template_directory_uri()
For Child Theme: get_stylesheet_directory() or get_stylesheet_directory_uri()
0
Super Model