Wordpress: доступ к функции плагина из темы - PullRequest
8 голосов
/ 23 октября 2009

Я пытаюсь добавить некоторые функции из плагина, который я сделал, в тему Wordpress, но у меня мало радости. Документация на самом деле не помогает мне решить проблему, так что, возможно, кто-то здесь может помочь.

У меня есть плагин в Wordpress, который активирован и работает нормально. Класс для этого плагина имеет функцию generateHtml, к которой я хотел бы получить доступ из Wordpress Theme. Но что бы я ни пытался, я не могу получить доступ к коду моего плагина.

Может ли дать мне краткое изложение того, что мне нужно сделать, чтобы получить код доступа к теме из плагина, и / или указать, что я ошибаюсь в своем коде:

Plugin:

<?php
/** Usual comments here **/

if (!class_exists("ImageRotator")) {
  class ImageRotator {
    private $uploadPath = '';
    private $pluginPath = '';
    private $options;

    function __construct() {
      $this->uploadPath = dirname(__file__).'\\uploads\\';
      // add_shortcode('imagerotator', array(&$this, 'generateHtml'));
    }

    // Various functions for plugin

    function generateHtml() {
      echo '<p>Hello World</p>';
    }
  }
}

/**
 * Create instance of image rotator
 */
$imageRotator = new ImageRotator();

/**
 * Create actions & filters for Wordpress
 */
if (isset($imageRotator)) {
  // Actions
  add_action('admin_menu', array(&$imageRotator, 'createMenu'));
  add_action('admin_init', array(&$imageRotator, 'registerSettings'));
  add_action('imagerotator_show', array(&$imageRotator, 'generateHtml'));
}

Часть заголовка страницы темы:

<?php if (isset($imageRotator)) {
        $imageRotator->generateHtml();
    } else if (isset($ImageRotator)) {
        print_r($ImageRotator);
    } else {
        echo '<p>Nope!</p>';
    }

    if (function_exists("imagerotator_show")) {
      echo 'Function found';
    } else {
      echo 'Function NOT found';
    }
?>

В настоящее время я вижу только «Нет» и «Функция НЕ найдена». Спасибо за любой вклад.

Lee

Ответы [ 3 ]

6 голосов
/ 23 октября 2009

Для начала «imagerotator_show» не является функцией; это название типа действия. Когда вы используете функцию add_action (), Wordpress просто добавляет ваш метод в список функций / методов для вызова при запуске определенного действия. Таким образом, ваш второй тест всегда будет отвечать «Функция НЕ найдена».

Наиболее вероятная причина первой проблемы - невозможность объявить метод, который вы хотите вызвать, как открытый метод. Вы также делаете код сложнее, чем нужно.

Лучшая практика, которую я видел для объявления методов и регистрации хуков в классе, выглядит примерно так:

if ( ! class_exists( 'Foo' ) ):
  class Foo {
    function __construct() {
      add_action( 'hook_name', array( &$this, 'my_hook_implementation' ) );
    }

    function my_hook_implementation() {
      // does something
    }

    public function my_special_method() {
      // does something else
    }
  }

if ( class_exists( 'Foo' ) ):
  $MyFoo = new Foo();

Это позволяет вашему классу хранить все детали реализации в секрете. Когда вам нужно вызвать my_special_method (), вы делаете это следующим образом:

$MyFoo->my_special_method();
1 голос
/ 11 ноября 2013

@ Андрей, так как я не могу комментировать, я думал, что отвечу на ваш вспомогательный вопрос. См:

http://net.tutsplus.com/tutorials/wordpress/create-wordpress-plugins-with-oop-techniques/

Где объясняется, что при определении функции обратного вызова из объекта вы должны использовать функцию массива. По сути, он говорит, что нужно получить функцию my_hook_implementation из объекта $ this и использовать ее в качестве параметра обратного вызова для ловушки add action. Это потому, что вы определили функцию в области видимости объекта, и вы должны определить область видимости, чтобы PHP знал, о какой функции вы говорите. Область видимости - это объект, указанный в переменной $ this.

0 голосов
/ 13 июля 2018

Вам просто нужно использовать функцию do_action() внутри вашей темы.

Если вы хотите, чтобы функция generateHtml появлялась внутри вашего header.php, вам просто нужно открыть файл header.php и вставить <?php do_action('imagerotator_show'); ?> туда, куда вы хотите, и тогда ваша функция будет вызываться там.

...