2016-09-01 16 views
5

Jestem nowy w tworzeniu wtyczek.Wordpress Plugin Dev: Błąd krytyczny: wywołanie niezdefiniowanej funkcji add_action()

Próbuję utworzyć niestandardową stronę formularza do wydrukowania w wp-admin, aby utworzyć adres pocztowy klienta.

bardzo podobny This plugin

gdy administrator kliknij "druku Adres" link pop-up template.php strona z adresem klienta i informacje o adresie druku

enter image description here

problem jest:

Występuje błąd krytyczny po kliknięciu na kolejność drukowania tag kotwica i nie mogę uruchomić dowolną wordpress działania na template.php:

Fatal error: Zadzwoń do niezdefiniowanej funkcji add_action() w C: \ xampp \ htdocs \ wp-content \ plugins \ generator adresu \ template.php na linii 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; 


     } 
    } 

Template.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; 
} 

} 
?> 
+0

Proszę wyjaśnić, co robi plik template.php? Nie jest jasne, co chcesz osiągnąć. Dlaczego nie możesz go mieć w tym samym pliku co plik wtyczki? Radziłbym również załadować całą wtyczkę na hak 'woocommerce_loaded', dzięki czemu będziesz mieć pewność, że wszystkie funkcje WooCommerce są gotowe. – helgatheviking

+0

Możliwy duplikat [this] (http://stackoverflow.com/questions/3947979/fatal-error-call-to-undefined-function-add-action?rq=1) lub [this] (http: // stackoverflow .com/questions/32094471/wordpress-plugin-how-to-resolve-call-to-undefined-function-add-action-as-wel? rq = 1) – helgatheviking

+0

@helgatheviking both not work – Radian

Odpowiedz

1

plik szablonu template.php jest poza Wordpress to nie mamy dostępu do podstawowych funkcji Wordpress. Dołącz ten plik w głównej wtyczce działa poprawnie, ale kiedy dostęp do tego pliku bezpośrednio przez url, to nie możemy uzyskać dostępu do podstawowych funkcji Wordpress, ponieważ nie jesteśmy śledzeni w sieci Wordpress. Tabela listy zamówień ma przycisk o nazwie url generujący jak coś jest http://localhost/wp-content/plugins/address%20generator/template.php?order=5147. Kiedy uzyskujemy dostęp, pojawia się następujący komunikat "Błąd krytyczny: wywołanie niezdefiniowanej funkcji add_action() w .."

Najpierw skomentuj tę linię w głównym pliku wtyczki.

// require_once('template.php'); 

Zmiany w pliku 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; 
} 

Ale to nie jest rozwiązanie Wordpress mieliźnie. Użytkownik @helgatheviking zapewnia najlepsze rozwiązanie.

+0

Świetnie! dziękuję za pomoc. to jest praca! – Radian

+0

Rozwiązanie @helgatheviking nie działa na mój niestety – Radian

4

Ponieważ nie wiem co yo Próbujesz osiągnąć, mogę tylko zasugerować następujące rzeczy jako ulepszenie sposobu uruchamiania wtyczki i sposobu wyświetlania niestandardowej kolumny.

/** 
* 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="%s" data-order_id="%s">%s</a>', $url, $order_id, __('Print Address', 'your-plugin')); 
      break; 
    } 
} 

EDIT 2 Zamierzamy stworzyć link do front-end, dzięki czemu możemy załadować własnego szablonu poprzez template_include. Powinien mieć wystarczającą ochronę, aby ograniczyć ją tylko do odpowiednich użytkowników.

// 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'; 

    } 
} 

Następnie plik /templates/my-plugin.php w folderze wtyczek:

<?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'); 
} 

Mam spadła funkcji na rzecz my_template()my_init() który będzie teraz załadować własnego szablonu (/templates/my-template.php) poprzez filtr template_include. Ten szablon jest ładowany przez WordPress i ma wszystkie funkcje WordPress dostępne do użycia.

+0

problem nie jest dodawanie kolumny, to działa dobrze, problem jest druga sekcja mojego kodu, kiedy 'Print Address' jest kliknięty – Radian

+0

tak naprawdę chcę wiedzieć, dlaczego funkcja na druga strona '" template.php "' nie działa – Radian

+0

Po uruchomieniu strony 'template.php', WP nie jest ładowana. Dlatego otrzymujesz fatalny błąd i powód, dla którego twoje podejście jest wadliwe. Będę edytować z sugestią, ale ponieważ nie mogę powiedzieć, co próbujesz zrobić, to tylko sugestia, a nie rozwiązanie cut-paste. – helgatheviking

Powiązane problemy