Support » Plugins » 2 ähnliche Plugins mit identischen Methoden – Fatal Error

  • Hallo,

    ich versuche gerade 2 sehr ähnliche Plugins zu programmieren. U.a. legen beide jeweils einen eigenen PostType an. Zur besseren Übersicht habe ich auch etwas Code ausgelagert, das per „include_once“ geladen werden soll.

    Damit ich das jeweils andere Plugin schnell updaten kann, habe ich die Methoden innerhalb verschiedener Klasse identisch benannt.

    PHP antwortet mir hierzu jedoch mit einem „Fatal error“, genauer gesagt mit „

    PHP Fatal error: Cannot redeclare register_posttype() (previously declared in [/geheimerpfad]/plugin1/includes/register_posttype.php:7) in [/geheimerpfad]/plugin2/includes/register_posttype.php on line [zeile]

    Die Klassen inkl. Instanzierung meiner Plugins sehen wie folgt aus:

    <?php
    // Plugin 1
    
    include_once __DIR__ . '/includes/register_posttype.php';
    
    class Plugin1 {
        function __construct() {
    		add_action( 'init', 'register_posttype' );
        }
    }
    
    $obj = new Plugin1();
    ?>

    bzw.

    <?php
    // Plugin 2
    
    include_once __DIR__ . '/includes/register_posttype.php';
    
    class Plugin2 {
        function __construct() {
    		add_action( 'init', 'register_posttype' );
        }
    }
    $obj = new Plugin2();
    ?>

    Die „includes“-Ordner befindliche „register_posttype.php“ für Plugin 1 sieht wie folgt aus:

    <?php
      function register_posttype() {
    	// [...]
        register_post_type( 'posttype1', $args );
      }
    ?>

    Und die für Plugin 2 so:

    <?php
      function register_posttype() {
    	// [...]
        register_post_type( 'posttype2', $args );
      }
    ?>

    Es hat sich also lediglich das 1. Argument der „register_post_type()“ geändert. In „meiner“ register_posttype() [ohne unterstrich] wird zuvor noch die Variable „$args“ definiert.

    Packe ich die Includes mit in die jeweiligen Klassen kommt ein noch größerer Fataler Error, sodass WordPress gar nicht mehr läuft

    Ich gebe auch zu, noch nich über alle PHP-Basics zu verfügen, dennoch versuche ich mit diesen Plugins gerade zu „üben“ 😉

    Kann mir zufällig jemand erklären, wie man soetwas richtig macht?

    Schon mal vielen Dank im Vorraus!

    Thomas

Ansicht von 2 Antworten - 1 bis 2 (von insgesamt 2)
  • Moderator Bego Mario Garde

    (@pixolin)

    Wir möchten hier vor allem Anwendungssupport anbieten und Benutzern, die Probleme bei der Nutzung von WordPress, Themes und Plugins, Hilfe zur Selbsthilfe anbieten. Bei Fragen zur Programmierung bist du bei WordPress Stackexchange besser aufgehoben, wobei auch dort grundlegende Programmierkenntnisse vorausgesetzt werden. Die können wir hier unmöglich vermitteln, weil es unsere Kapazitäten sprengen würde.

    Einen guten Start in die Entwicklung von Plugins bietet das Plugin Handbook.

    Bei der Entwicklung von Plugins solltest du soweit wie möglich auf WordPress-Funktionen zurückgreifen. Um innerhalb eines Plugins Funktionen aus einer anderen Datei zu laden, kannst du z.B. die Funktion plugin_dir_path() verwenden:

    define( 'MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
    include( MY_PLUGIN_PATH . 'includes/admin-page.php');
    include( MY_PLUGIN_PATH . 'includes/classes.php');
    // etc.

    Die optimale Benennung von Variablen, Funktionen und Dateinamen gehört bekanntlich zu den schwersten Dingen bei der Programmierung. Funktionen sollten so benannt werden, dass sie nicht mit WordPress-Funktionen oder aber Funktionen anderer Plugins kollidieren. Außerdem sollte klar sein, was gemeint ist. Eine Funktion register_posttype() in einer gleichnamigen Datei register_posttype.php, die beide nicht direkt etwas mit der WordPress-Funktion register_post_type() zu tun haben, stiften eher Verwirrung.

    PHP-Klassen (Class) werden bei der Programmierung von Plugins eher bei komplexen Vorhaben verwendet, während für einfache Plugins prozeduraler Code mit Namespaces öfters verwendet wird. Die einfachste Methode, Funktionsnamen zu benennen, ist ihnen eine Vorsilbe zu geben, die zum Entwickler oder Namen des Plugins passt. In Programmierbeispielen siehst du oft sowas wie my_register_posttype_books() (mit der sinnbildlichen Vorsilbe my_, die du durch eine eigene Vorsilbe ersetzen solltest). Das ist dann nicht so leicht mit der WordPress-Funktion register_post_type() zu verwechseln.

    Das Sahnehäubchen auf der Kirsche ist, wenn du bei der Programmierung auch noch die Coding-Standards einhältst, die z.B. einheitlich festlegen, dass für WordPress bei PHP-Skripten Tabs statt Leerzeichen verwendet werden. Es ist sinnvoll, die Coding-Standards per Erweiterung im Programmiereditor zu nutzen, weil dir dann beim Programmieren Fehler (z.B. das schließende PHP-Tag ?> am Ende der Skripte) gleich angezeigt werden. Für einen Programmier-Einsteiger ist das aber nicht unbedingt trivial, deshalb wie gesagt eher Sahnehäubchen.

    Ein Programmiereditor wie Visual Studion Code lässt sich außerdem so einrichten, dass du beim Programmieren Funktionen gleich nachschlagen kannst. Ansonsten lohnt es sich immer, in der Referenz nachzuschlagen. Für add_action() findest du z.B. ein Programmierbeispiel, mit dem dir gezeigt wird, wie die Funktion innerhalb einer Class verwendet wird:

    public function __construct() {
      add_action( 'init', array( $this, 'my_register_posttype_book' ) );
    }

    Das waren alles ein paar kurze Tipps für den Einstieg, aber wir können hier wie gesagt keine Grundlagen vermitteln. Du findest aber im Internet diverse Tutorials, um ein eigenes Plugin zu entwickeln, auf Youtube auch als Film, den du beliebig vor- und zurückspulen kannst. Lass dich von anfänglichen Problemen nicht einschüchtern. Die meisten Anwender bekommen sehr schnell den Dreh raus und programmieren schon nach kurzer Zeit die tollsten Dinge. Bei Denkblockkaden hilft der Blick in andere Plugins, die ähnliche Features umsetzen. Und bei Code, den du in einem eigenen GitHub-Repository veröffentlichst, können andere sich den Code anschauen, Fehler beschreiben und Vorschläge für bessere Lösungen machen.

    Viel Erfolg.

    Thread-Starter tommy489

    (@tommy489)

    Hey, erstmal Danke für die Rückmeldung! Ich dachte weil auf der Haupt-Forenseite „[Die Foren] … sind ein großartiger Ort, um zu lernen, zu teilen, und Fehler zu beheben.“ Dachte da an letzteres.. Die „stackexchange“ ist mir jedenfalls selbst beim „googlen“ noch nie begnet. Kann aber auch sein, dass ich immer einen großen Bogen um englischsprachige Seiten machen.. Da habe ich gerade selbst bei deinem Links schon wieder die Krise bekommen. Wahrscheinlich muss ich da doch mal alles mit dem Google-Übersetzter durch gehn.. Und den Visual Studion Code, von dem ich auch noch nichts gehört habe, muss ich mir wohl auch mal anschauen. Bisher nutzte ich immer Notepad++.

    Da bin ich mal gespannt, ob ich den gewünschten Erfolg erreiche 😉

    Viele Grüße

    Thomas

Ansicht von 2 Antworten - 1 bis 2 (von insgesamt 2)