Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Includowanie juz wykonanego skryptu
Forum PHP.pl > Forum > PHP
bodzio16
Witam!

Mam wordpress, chcę wstawić jego nagłowek i stopkę do templatów innych skryptów, które używam. Najprościej byłoby skopiować kod html z wyniku, i wkleić, ale wtedy stracę dynamikę - modyfikowanie menu itp.

Wordpress daje możliwość wstawienia nagłówka i stopki poprzez kod:

  1. <?
  2. require('wp-load.php');
  3. include('wp-content/themes/theme/header.php');
  4. ?>



Niestety powstaje wtedy u mnie konflikt skyptów, nazw funkcji, i takie wstawienie nie działa. Do tego mam jeszcze powiązane bazodanowo phpBB z Wordpressem stąd szukam innego rozwiązania.

Wymyśliłem, że wykonam "na boku", w osobnym pliku (test.php) to powyższe, a potem wynik już jako czysty HTML+CSS, dodam do header templatki mojego skryptu (header.html) i będzie działało. Zrobiłem to tak:

test.php
  1. <?
  2. require('wp-load.php');
  3. include('wp-content/themes/theme/header.php');
  4. $header_output = ob_get_contents();
  5. ?>



Całość includuję tak do header.html (templatka z obługą php):

  1. <?
  2. include('test.php');
  3. echo($header_output);
  4. ?>



Niestety znowu powstaje konflikt, czyli nie includuję wyniku, tylko jednak skrypt.

Potem wpadłem na pomysł, że przecież konflikty biorą się z wp-load.php, zatem trzeba go includować do bufora, by nie trafił do header.html. Zrobiłem tak:

test.php
  1. <?
  2. require('wp-load.php');
  3. include('wp-content/themes/theme/header.php');
  4. $header_output = ob_get_contents();
  5. ?>


Niestety nic to nie zmieniło.

Przetestowałem sam plik test.php tak jak poniżej, i działa. Po includzie do header.html niestety nie błąd redeklarowanej funkcji.

test.php
  1. <?
  2. require_once('wp-load.php');
  3. include_once('wp-content/themes/theme/header.php');
  4. $header_output = ob_get_contents();
  5.  
  6. echo($header_output);
  7. ?>


Dla testu zapisałem zawartość (przez fwrite()) $header_output do pliku tekstowego - wygenerował się właśnie czysty html, bez zawartości plików php. Zatem wydaje się, że coś jednak jest nie tak z includami...
W teorii mógłbym teraz includować zawartość tego pliku textowego, ale uważam za niewydaje za każdym razem generowanie pliku textowego?

Czy ktoś może mi poradzić gdzie popełniam błąd, ewentualnie inne rozwiązanie? Co zrobić, by zawartość wp-load.php nie trafiała do templatki?
KsaR
include* i require* służą aby dołączyć kod do skryptu.
Jeśli chcesz dołączyć sam wynik bez skryptu skojrzystaj z file_get_contents();

Czyli.. jak próbowałeś tak:
Cytat
  1. require_once('wp-load.php');
  2. include_once('wp-content/themes/theme/header.php');
  3. $header_output = ob_get_contents();
  4.  
  5. echo($header_output);


Żeby działało musisz tak:
  1. $headers=file_get_contents('wp-load.php');
  2. $headers.=file_get_contents('wp-content/themes/theme/header.php');
  3. // lub
  4. $headers=file_get_contents('wp-load.php').file_get_contents('wp-content/themes/theme/header.php');
bodzio16
Nie rozumie, get_file_contents zapisuje przecież zawartośc do zmiennej - a ja chcę wyonać wszystko to, co się dzieje w wp-load.php i header.php.

Jak zrobiłem

  1. <?
  2. //require_once('wp-load.php');
  3. //include_once('wp-content/themes/remix/header.php');
  4. //$header_output = ob_get_contents();
  5.  
  6. $header=file_get_contents('/wp-content/themes/header/header.php');
  7. $wpload=file_get_contents('/wp-load.php');
  8. echo($header);
  9. echo($wpload);
  10. $header_output = ob_get_contents();
  11. ?>


To i tak to nie zadziała, a jak dam bez echo - podobnie, nie wykona się...
Pyton_000
zawsze możesz dać

  1. $header=file_get_contents('http://domena.pl/wp-content/themes/header/header.php');
IProSoft
Utwórz sobie plik, np: header-custom.php i wklej do niego:

  1. <?php
  2. require_once('wp-load.php');
  3. include_once('wp-content/themes/theme/header.php');
  4. ?>


A w miejscu gdzie chcesz wstawić jego efekt, dodaj:

  1. echo file_get_contents('http://domena.pl/header-custom.php');
bodzio16
Niestety tak nie działa. Zamiast tego wstawia mi po prostu zawartość custom-header.php, czyli:

<?php
require_once('wp-load.php');
include_once('wp-content/themes/theme/header.php');
?>

a nie wykonany skrypt...
Pyton_000
Pokaż kod bo mi się wierzyć nie chce
lukasz1985
Lepiej rozwiąż konflikty nazw. Nie ma nic gorszego niż takie głupie triki jak ten z file_get_contents.
Pyton_000
Cytat
Nie ma nic gorszego niż takie głupie triki

Są, uwierz mi na słowo wink.gif
bodzio16
zawartosc test.php

<?
require_once('wp-load.php');
include_once('wp-content/themes/theme/header.php');
?>

zawartość header.html

  1. <?php
  2.  
  3. echo(file_get_contents('/home/public_html/wp/test.php'));
  4.  
  5.  
  6. ?>


Kod źródłowy juz w przeglądarce header.html:

  1. <?
  2.  
  3. require_once('wp-load.php');
  4. include_once('wp-content/themes/remix/header.php');
  5.  
  6. ?>
  7.  
  8. <script language="javascript" type="text/javascript">
  9. <!--
  10.  
  11. var captcha_reload_count = 0;
  12. var captcha_image_url = "./captcha.php";
  13. function new_captcha_image() {
  14. if (captcha_image_url.indexOf('?') == -1) {
  15. document.getElementById('captcha_image').src= captcha_image_url+'?c='+captcha_reload_count;
  16. } else {
  17. document.getElementById('captcha_image').src= captcha_image_url+'&c='+captcha_reload_count;
  18. }
  19.  
  20. //blablabla... i reszta zawartości header.html


Czyli, że wstawia mi treść test.php, a nie wynik zawartych w nim skryptów.
Wazniak96
Masz podać pełen link z przeglądarki a nie ścieżka...
bodzio16
bez zmian, czy mam
  1. <?php
  2.  
  3. echo(file_get_contents('http://www.domena.pl/wp/test.php'));
  4.  
  5. ?>


czy ze ścieżką.. więc to nie to, mimo takiegho pewnego tonu.
IProSoft
Otwiersz short tagiem w pliku test.php,
  1. <?

zamień na
  1. <?php
bodzio16
bez zmian, znowu treść test.php w header.html zamiast wykonanego header.php / wp-load.php
IProSoft
A gdy odpalasz w przeglądarce plik http://www.domena.pl/wp/test.php pojawia się tekst ?

Jeśli tak to nie parsuje Ci pliku jako PHP
bodzio16
pojawia się, jak już pisałem, poprawnie, czyli to, czego oczekuję - grafika, rozwijane menu etc. zatem parsuje.
salfunglandyare
A co pokazuje:
  1. echo file_get_contents('http://www.domena.pl/wp/test.php');
  2. var_dump($http_response_header);

?
bodzio16
W treści:

  1. <?php
  2. require_once('wp-load.php');
  3. include_once('wp-content/themes/theme/header.php');
  4. ?>NULL
IProSoft
Kod w taki sposób pojawi się w wypadku użycia odwołania do pliku, np file_get_contents('/wp/test.php');, więc upewnij się, że wpisujesz też adres domeny.

lub

Spróbuj tak:
  1. function curl_download($Url){
  2.  
  3. // is cURL installed yet?
  4. if (!function_exists('curl_init')){
  5. die('Sorry cURL is not installed!');
  6. }
  7.  
  8. // OK cool - then let's create a new cURL resource handle
  9. $ch = curl_init();
  10.  
  11. // Now set some options (most are optional)
  12.  
  13. // Set URL to download
  14. curl_setopt($ch, CURLOPT_URL, $Url);
  15.  
  16. // Set a referer
  17. curl_setopt($ch, CURLOPT_REFERER, 'http://' . parse_url($Url, PHP_URL_HOST) );
  18.  
  19. // User agent
  20. curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
  21.  
  22. // Include header in result? (0 = yes, 1 = no)
  23. curl_setopt($ch, CURLOPT_HEADER, 0);
  24.  
  25. // Should cURL return or print out the data? (true = return, false = print)
  26. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  27.  
  28. // Timeout in seconds
  29. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  30.  
  31. // Download the given URL, and return output
  32. $output = curl_exec($ch);
  33.  
  34. // Close the cURL resource, and free system resources
  35. curl_close($ch);
  36.  
  37. return $output;
  38. }
  39.  
  40. echo curl_download('http://www.domena.pl/wp/test.php');
bodzio16
I tu ciekawostka: Forbidden 403, czyli coś po drodze jest "zabronione", chyba nie chmody... Może coś template jednak blokuje?

EDIT:

Kombinowałem - nie wiem dlaczego tak się dzieje. Może ktoś mi coś podpowiedzieć?
Pyton_000
Podaj adresy bo tak to będziemy się bawić do końca świata.
bodzio16
Wynik oparty na header.html
http://www.bonjovi.pl/galeria/

Plik test.php
http://www.bonjovi.pl/wp/test.php
IProSoft
Odpaliłem:

  1. file_get_contents('http://www.bonjovi.pl/wp/test.php');


I wszystko wyświetla poprawnie.
bodzio16
Teraz też tak zrobiłem: http://www.bonjovi.pl/galeria/

Forbidden. Co może byc przyczyną?
IProSoft
Pokaż plik galeria/includes/template.php, linie od 80 do 120
bodzio16
też patrzyłem, tam jest eval(). Pociągnałem więcej, do tam jest ogarnianie kodu. Oczywiście PHP_EXEC_CODE jest defined i "1":

  1. if (defined('EXEC_PHP_CODE') && EXEC_PHP_CODE == 0) {
  2. $line = preg_replace("/<[\?|%]+(php|=)?(.*)[\?|%]+>/siU", "", $line);
  3. $line = preg_replace("/<script\s+language\s?=\s?[\"|']?php[\"|']?>(.*)<\/script>/siU", "", $line);
  4. }
  5.  
  6. $line = $this->compile_template($line);
  7.  
  8. $this->template_cache[$template] = $line;
  9. }
  10. return $this->template_cache[$template];
  11. }
  12.  
  13. function parse_template($template) {
  14. $template = $this->get_template($template);
  15.  
  16. // Don't show error notices
  17. $old = error_reporting(E_ALL ^ E_NOTICE);
  18.  
  19. extract($this->val_cache);
  20. ob_start();
  21. //echo $template;
  22. eval("?>".$template."<?php return 1;");
  23.  
  24. $str = ob_get_contents();
  25. ob_end_clean();
  26.  
  27. // Reset error_reporting
  28. error_reporting($old);
  29.  
  30. return $str;
  31. }
  32.  
  33. function compile_template($template)
  34. {
  35. // Replace <?xml by printing them via php to avoid error messages when short_open_tags is on
  36. $template = preg_replace('/<\?xml/i', "<?php echo '<?xml'; ?>", $template);
  37.  
  38. // Compile variables in PHP code
  39. preg_match_all(
  40. "/<[\?|%]+(php|=)?(.*)[\?|%]+>/siU",
  41. $template,
  42. $regs,
  43. PREG_SET_ORDER
  44. );
  45.  
  46. for ($i = 0; isset($regs[$i]); $i++) {
  47. // Fix single quotes
  48. $parsed = preg_replace_callback(
  49. "/=\s*'(.*)".preg_quote($this->start)."([A-Z0-9_]+)".preg_quote($this->end)."(.*)';/Usi",
  50. array(&$this, '_fix_php_quotes'),
  51. $regs[$i][0]
  52. );
  53.  
  54. $parsed = preg_replace_callback(
  55. '='.preg_quote($this->start).'([A-Z0-9_]+)'.preg_quote($this->end).'=Usi',
  56. array(&$this, '_compile_php_var'),
  57. $parsed
  58. );
  59.  
  60. $template = str_replace($regs[$i][0], $parsed, $template);
  61. }
  62.  
  63. // Compile variables
  64. $template = preg_replace_callback(
  65. '='.preg_quote($this->start).'([A-Z0-9_]+)'.preg_quote($this->end).'=Usi',
  66. array(&$this, '_compile_var'),
  67. $template
  68. );
  69.  
  70. // Compile condition tags
  71. $template = preg_replace_callback(
  72. '='.preg_quote($this->start).'if(not?)?\s+([A-Z0-9_]+)'.preg_quote($this->end).'=Usi',
  73. array(&$this, '_compile_condition_start'),
  74. $template
  75. );
  76.  
  77. $template = preg_replace_callback(
  78. '='.preg_quote($this->start).'endif(not?)?\s+([A-Z0-9_]+)'.preg_quote($this->end).'=Usi',
  79. array(&$this, '_compile_condition_end'),
  80. $template
  81. );
  82.  
  83. return $template;
  84. }
  85.  
  86. function _compile_php_var(&$matches) {
  87. return '{$' . trim($matches[1]) . '}';
  88. }
  89.  
  90. function _fix_php_quotes(&$matches) {
  91. return '= "' . str_replace('"', '\\"', $matches[1])
  92. . $this->start.$matches[2].$this->end
  93. . str_replace('"', '\\"', $matches[3]) . '";';
  94. }
salfunglandyare
Namieszane... ale jak bym miał strzelać, to:
ln 2 - usuwasz <?php i ?>
ln 22 - eval zamyka i otwiera tagi, więc:

zakomentuj na próbę ln 2
  1. //$line = preg_replace("/<[\?|%]+(php|=)?(.*)[\?|%]+>/siU", "", $line);


lub zdefiniuj w konfiguracji EXEC_PHP_CODE = 1 (nie PHP_EXEC_CODE)
bodzio16
Napisałem, że EXEC_PHP_CODE jest zdefiniowane na 1, zatem komentowanie nic nie da, bo warunek nie jest spełniony. Zrobiłem czeski błąd podając co jest zdefiniowane, ale tak czy inaczej jest zdefiniowane.
IProSoft
Wstaw przed linią:
  1. eval("?>".$template."<?php return 1;");

kod:
  1. var_dump($template);


I wrzuć gdziś efekt z linku http://www.bonjovi.pl/galeria/, może coś znajdziemy.
bodzio16
wszystko widać tutaj: http://www.bonjovi.pl/galeria/

kod:
http://paste.ofcode.org/fzQb44UF6a4TreKGkKKg9R

Znalazłem też coś takiego w logach:

File does not exist: /home/bodzio/domains/bonjovi.pl/public_html/galeria/<, referer: http://www.bonjovi.pl/galeria/

Zatem chyba coś jest na rzeczy z "<?php" i eval.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.