WordPress Plugin Dev: Fatal error: Call to undefined function add_action()

Lesezeit: 7 Minuten

Benutzer-Avatar
Hamed Mayahian

Ich bin neu in der Plugin-Entwicklung.

Ich versuche, eine benutzerdefinierte druckbare Formularseite in wp-admin zu erstellen, um die Postanschrift des Kunden zu erstellen.

sehr ähnlich Dieses Plugin

wenn der Administrator auf klickt “Adresse drucken” Link, Popup template.php Seite mit Kundenadresse und Angaben zur Druckadresse

Geben Sie hier die Bildbeschreibung ein

Das Problem ist :

Ich erhalte einen schwerwiegenden Fehler, wenn ich auf klicke Bestellung drucken Anker-Tag und ich kann keine ausführen wordpress Aktion an template.php:

Schwerwiegender Fehler: Aufruf der undefinierten Funktion add_action() in C:\xampp\htdocs\wp-content\plugins\address generator\template.php in Zeile 4

 <?php
    /**
    * Plugin Name: Address Generator
    * Plugin URI: http://CGTV.ir
    * Description:Generate Postal Label for Parcel
    * Version: 1.0 or 
    * Author: Hamed Mayahian
    * Author URI: CGTV.ir
    * License: A "Slug" license name e.g. GPL12
    */
    // ADDING COLUMN TITLES (Here 2 columns)
    /*define( 'MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
    include( MY_PLUGIN_PATH . 'template.php');
    */      

      require_once(ADDRESS__PLUGIN_DIR .'template.php');




    add_filter( 'manage_edit-shop_order_columns', 'custom_shop_order_column',11);
    function custom_shop_order_column($columns)
    {
       //add columns
        $columns['my-column1'] = __( 'چاپ آدرس','theme_slug');
       return $columns;

    }

    // adding the data for each orders by column (example)
    add_action( 'manage_shop_order_posts_custom_column' , 'cbsp_credit_details', 10, 2 );
    function cbsp_credit_details( $column )
    {
        global $post, $woocommerce, $the_order;
        $order_id = $the_order->id;

        switch ( $column )
        {
            case 'my-column1' :
                $myVarOne = wc_get_order_item_meta( $order_id, '_the_meta_key1', true );
                echo $myVarOne;
                echo "<a target="_blank" href="".plugins_url( "template.php' , __FILE__ )."?order=$order_id'>Print Address</a>";
                break;


        }
    }

Vorlage.php

<?php


add_action('init', 'my_init', 1);
function my_init(){

    global $post, $woocommerce, $the_order;

    $id = $_GET['order'];
    $order = new WC_Order($id);
    $address    = $order->get_billing_address();

    $customer_id = get_current_user_id();
if($_GET['order'] == "") {
  // no username entered
  echo "آدرس پیدا نشد";
} else {
  echo "Hello, " . $address;
}

}
?>

  • Erklären Sie bitte, was die Datei template.php macht. Es ist unklar, was Sie erreichen wollen. Warum können Sie es nicht in derselben Datei wie die Plugin-Datei haben? Ich würde dir auch raten, dein gesamtes Plugin auf die zu laden woocommerce_loaded Haken, damit Sie sicher sein können, dass alle WooCommerce-Funktionen bereit sind.

    – Helgathewikinger

    1. September 2016 um 20:44 Uhr


  • Mögliches Duplikat von diesem oder diesem

    – Helgathewikinger

    1. September 2016 um 20:45 Uhr

  • @helgatheviking funktionieren beide nicht

    – Hamed Mayahian

    2. September 2016 um 6:20 Uhr

  • Es ist das gleiche, weil Sie versuchen, WordPress-Funktionen für eine Datei aufzurufen template.php das ist außerhalb von WordPress und daher wird WordPress nicht geladen. Die Lösung ist also Pause Wird geladen template.php und versuchen, es WordPress-Funktionen ausführen zu lassen.

    – Helgathewikinger

    2. September 2016 um 16:51 Uhr


  • Bitte fügen Sie weitere hinzu relevant Informationen, bevor Sie ein Kopfgeld posten. Die eine Antwort hat viele Detailsist aber nicht sehr spezifisch, da wir nicht sicher sind, was Sie erreichen möchten.

    – Aurelie

    8. September 2016 um 17:27 Uhr

Benutzer-Avatar
Helgathewikinger

Da ich nicht weiß, was Sie zu erreichen versuchen, kann ich nur Folgendes als Verbesserung vorschlagen, wie Sie Ihr Plugin starten und wie Sie die benutzerdefinierte Spalte anzeigen.

/**
 * Plugin Name: Custom Shop Column Link
 * Plugin URI: http://stackoverflow.com/a/39280792/383847
 * Description: Link for shop column to display billing address
 * Version: 1.0.0
 * Author: helgatheviking
 * Author URI: http://kathyisawesome.com/
 * Text Domain: your-plugin
 * Domain Path: /languages
 *
 * Copyright: © 2015 Kathy Darling and Manos Psychogyiopoulos
 * License: GNU General Public License v3.0
 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
 */


// add all your hooks only when woocommerce has fully loaded it's files
add_action( 'woocommerce_loaded', 'custom_address_generator_init' );
function custom_address_generator_init(){
    add_filter( 'manage_edit-shop_order_columns', 'custom_shop_order_column',11);
    add_action( 'manage_shop_order_posts_custom_column', 'cbsp_credit_details',11);
}

// add your custom column
function custom_shop_order_column($columns)
{
   //add columns
    $columns['my-column1'] = __( 'چاپ آدرس', 'your-plugin');
   return $columns;

}

// adding the data for each orders by column (example)
function cbsp_credit_details( $column )
{
    global $the_order;
    $order_id = $the_order->id;

    switch ( $column )
    {
        case 'my-column1' :
            $myVarOne = get_post_meta( $order_id, '_the_meta_key1', true );
            echo $myVarOne;
            $url = add_query_arg( array( 'order_id' => $order_id, 'my-action' => 'do-something-cool', ), wp_nonce_url( admin_url(), 'my_order_nonce', 'my_nonce' ) );
            printf( '<a class="custom-class" href="https://stackoverflow.com/questions/39279237/%s" data-order_id="https://stackoverflow.com/questions/39279237/%s">%s</a>', $url, $order_id, __( 'Print Address', 'your-plugin' ) );
            break;
    }
}

BEARBEITEN 2 Wir werden einen Link zum Front-End erstellen, damit wir eine benutzerdefinierte Vorlage über laden können template_include. Es sollte über genügend Sicherheit verfügen, um es nur auf die entsprechenden Benutzer zu beschränken.

// load a custom template when special link is clicked
add_action( 'template_include', 'my_template', 1 );
function my_template(){

    if( isset( $_GET['my-action'] ) && $_GET['my-action'] == 'do-something-cool' && isset( $_GET['order_id'] ) && current_user_can( 'edit_shop_order', $_GET['order_id'] ) && wp_verify_nonce( $_GET['my_nonce'], 'my_order_nonce' ) ){

        return untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/templates/my-template.php';

    }
}

Dann ein /templates/my-plugin.php Datei in Ihrem Plugin-Ordner:

<?php

$order_id = intval( $_GET['order_id'] );
$order = wc_get_order($order_id);

if( is_a( $order, 'WC_Order' ) ){
    $address    = $order->get_formatted_billing_address ();
    if( $address ){
        printf( '%s, %s', __( 'Hello', 'your-plugin' ), $address );
    } else {
        _e( 'No billing address', 'your-plugin' );
    }
} else {
    _e( 'Not a valid order ID', 'your-plugin' );
}

Ich habe die fallen gelassen my_init() Funktion zugunsten von my_template() Dadurch wird nun eine benutzerdefinierte Vorlage geladen (/templates/my-template.php) über die template_include Filter. Diese Vorlage wird von WordPress geladen und verfügt über alle WordPress-Funktionen, die Ihnen zur Verfügung stehen.

  • Das Problem besteht darin, keine Spalte hinzuzufügen, das funktioniert gut, das Problem ist der zweite Abschnitt meines Codes, wenn die <a target='_blank' href='".plugins_url( 'template.php' , __FILE__ )."?order=$order_id'>Print Address</a> angeklickt wird

    – Hamed Mayahian

    2. September 2016 um 6:20 Uhr

  • Eigentlich möchte ich wissen, warum die Funktion auf der zweiten Seite "template.php" funktioniert nicht

    – Hamed Mayahian

    2. September 2016 um 7:13 Uhr

  • Wenn Sie die treffen template.php Seite, WP wird nicht geladen. Aus diesem Grund erhalten Sie einen schwerwiegenden Fehler und Ihr Ansatz ist fehlerhaft. Ich werde mit einem Vorschlag bearbeiten, aber da ich nicht sagen kann, was Sie versuchen zu tun, ist es nur ein Vorschlag und keine Lösung zum Ausschneiden und Einfügen.

    – Helgathewikinger

    2. September 2016 um 16:47 Uhr

  • Danke für deine Hilfe, lass mich erklären, das template.php in meinem Plugin-Ordner, also möchte ich ein Adressetiketten-Plugin wie dieses erstellen: wordpress.org/plugins/woocommerce-order-address-print

    – Hamed Mayahian

    2. September 2016 um 19:34 Uhr

  • Ich habe es getestet und es funktioniert, also bin ich mir nicht sicher, was Sie falsch machen. Nehmen Sie das Original-Plugin und fügen Sie die my_template() Funktion von Bearbeiten 2. Stellen Sie dann sicher, dass Ihre /templates/my-template.php an der richtigen Stelle (in Ihrem neuen Plugin-Ordner). Versuchen Sie, es einzuschalten WP_DEBUG_LOG um zu sehen, ob Sie irgendwelche Fehler haben.

    – Helgathewikinger

    8. September 2016 um 18:05 Uhr

Die Datei template.php befindet sich außerhalb von WordPress, dann haben wir keinen Zugriff auf die Kernfunktionen von WordPress. Das Einschließen dieser Datei in das Haupt-Plugin funktioniert ordnungsgemäß, aber wenn wir direkt per URL auf diese Datei zugreifen, können wir nicht auf die Kernfunktionen von WordPress zugreifen, da wir WordPress nicht folgen. Die Bestelllistentabelle hat eine Schaltfläche namens URL generieren, wie etwas ist http://localhost/wp-content/plugins/address%20generator/template.php?order=5147. Wenn wir darauf zugreifen, erhalten wir den folgenden Fehler: “Fatal error: Call to undefined function add_action() in..”

Kommentieren Sie zuerst diese Zeile in Ihrer Haupt-Plugin-Datei.

 // require_once('template.php');

Änderungen in der Datei template.php.

<?php

require('../../../wp-load.php');


    $id = $_GET['order'];
    $order = new WC_Order($id);
    $address    = $order->get_billing_address();

    $customer_id = get_current_user_id();
if($_GET['order'] == "") {
  // no username entered
  echo "آدرس پیدا نشد";
} else {
  echo "Hello, " . $address;
}

Dies ist jedoch keine gestrandete WordPress-Lösung. Benutzer @helgatheviking bietet hierfür die beste Lösung.

  • Die @helgatheviking-Lösung funktioniert bei mir leider nicht

    – Hamed Mayahian

    10. September 2016 um 17:51 Uhr

1371550cookie-checkWordPress Plugin Dev: Fatal error: Call to undefined function add_action()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy