2017-07-26 1 views
0

Ich bin ziemlich neu in PHP und lerne immer noch, wie einige der Funktionen include/require funktionieren. Ich arbeite an einem Plugin, und ich versuche, die Hauptvorlage in ein paar Dateien aufzuteilen, um das Lesen/Verwalten zu erleichtern (wenn das eine schlechte Idee ist, ist das eine ganz andere Diskussion). Mein Plugin für öffentliche Ordner sehen irgendwie wie folgt aus:Warum schließt meine PHP-Anweisung fehl, wenn ich das Verzeichnis in den relativen Pfad einschließe?

resources-plugin 
    ├── includes 
    │ ├── class-resources-short-codes.php 
    │ └── index.php 
    ├── index.php 
    ├── public 
    │ └── partials 
    │  ├── resources-banner.php 
    │  ├── resources-filters.php 
    │  ├── resources-items.php 
    │  └── resources-query.php 

In meinen Klasse-Ressourcen-Kurz codes.php Datei, ich habe drei Arbeits Aussagen enthalten:

add_shortcode('example-resources-sc', function() { 

    // Banner 
    include(dirname(__FILE__) . "/../public/partials/resources-banner.php"); 

    echo "<article class='resources flex-container'>"; 

    // Filters 
    include(dirname(__FILE__) . "/../public/partials/resources-filters.php"); 

    // Resources 
    include(dirname(__FILE__) . "/../public/partials/resources-items.php"); 

    echo "</article><!-- /resources -->"; 

}); 

Dann in dem Kind Vorlage Ressourcen-filters.php, ich habe eine andere umfasst das soll in dem HTML-Code aus den Ressourcen-query.php Datei ziehen:

<?php 

// Doesn't work 
// include("./resources-query.php"); 
// include(plugins_url("resources-plugin/public/partials/resources-query.php")); 

// Works 
//include("resources-query.php"); 
include(dirname(__FILE__)) . "/resources-query.php"; 

?> 

<div class="slide-container">Other HTML here.</div> 

Meine Frage ist - warum funktionieren zwei dieser Methoden, aber die anderen beiden nicht? Ich weiß, ich bin ein wenig verwirrt darüber, wie Dateipfade bestimmt werden, wenn Sie verschachtelte Include-Anweisungen verwenden.

PHP-Version: 5.3.3 Wordpress Version: 4.2.2

Dank!

+0

Das Starten eines Pfades mit '/' bedeutet Start an der Wurzel. – j08691

+1

Ich weiß nicht, wie das letzte Beispiel funktionieren könnte. Klammern sind falsch. Änderung: 'include (dirname (__FILE__)). "/ Ressourcen-Abfrage.php ";' auf: (. dirname (__FILE__) 'umfassen "/resources-query.php");' – manassehkatz

+0

@manassehkatz Dies ist definitiv ein Tippfehler in meinem Code als auch, so ich habe keine Ahnung, warum es funktioniert, aber es wird angezeigt. – kauffee000

Antwort

3

Als allererstes würde ich empfehlen, nur dirname() einmal oben im Skript zu verwenden, wenn Sie müssen. Wenn Sie in wp-config.php aussehen werden Sie sehen, dass sie ähnlich um die Linie 80 so etwas tun:

define('ABSPATH', dirname(__FILE__) . '/'); 

in Ihrem Fall, dass Sie etwas tun könnte:

define('MYPATH', dirname(__FILE__)); 


add_shortcode('example-resources-sc', function() { 

    // Banner 
    include(MYPATH . "/../public/partials/resources-banner.php"); 

    echo "<article class='resources flex-container'>"; 

    // Filters 
    include(MYPATH . "/../public/partials/resources-filters.php"); 

    // Resources 
    include(MYPATH . "/../public/partials/resources-items.php"); 

    echo "</article><!-- /resources -->"; 

}); 

Jetzt die Fragen, die Sie gefragt:

include("./resources-query.php"); 

Dies funktioniert nicht, da standardmäßig PHP wird das Verzeichnis, das Sie nicht davon ausgehen, sind in Seltsamer PHP ermöglicht es Ihnen, eine Datei im selben Verzeichnis zu verweisen, wenn Sie dieentfernen.aber versuchen Sie, dieses Verhalten zu vermeiden, da es im Allgemeinen nur verwirrend ist.

include(plugins_url("resources-plugin/public/partials/resources-query.php")); 

Das Problem mit dem zweiten Beispiel, das Sie gaben, ist, dass Sie versuchen, eine URL nicht einen Pfad einzuschließen. Einige Systeme erlauben dies, aber standardmäßig nicht.

In der Regel würde ich empfehlen, immer Dateien mit absoluten Dateinamen aufzunehmen, wie Sie es in den Beispielen getan haben, die funktionieren. Vielleicht überlegen Sie, eine Konstante zu definieren, wie ich es erwähnt habe, und dies sollte helfen, sicherzustellen, dass Sie immer auf die richtigen Pfade zeigen. Wenn Sie eine Fehlerrückmeldung benötigen, um Dinge zu erklären, verwenden Sie require_once anstelle von include zu Testzwecken. Und schließlich solltest du davon absehen, Wege zu benutzen, die /../ enthalten, da sie dir am Ende nur Kopfschmerzen bereiten werden.

Koda

+0

Das funktionierte und machte viel Sinn. "Dies funktioniert nicht, weil PHP standardmäßig gewonnen hat nimm das Verzeichnis an, in dem du dich befindest. "Das wusste ich auch nicht. Danke! – kauffee000

Verwandte Themen