Pregunta

Estoy tratando de agregar algunas funcionalidades de un complemento que he creado en un tema de Wordpress, pero tengo poca alegría. La documentación realmente no me ayuda a resolver el problema, así que quizás alguien aquí pueda ayudarme.

Tengo un complemento en Wordpress que está activado y funciona bien. La clase para este complemento tiene una función llamada generateHtml a la que me gustaría acceder desde un tema de Wordpress. Pero sea lo que sea que intente, parece que no puedo acceder al código de mi complemento.

Puede darme un resumen de lo que necesito hacer para que un tema acceda al código desde un complemento y / o señalar que me equivoco en el código:

Complemento:

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

Parte de la página del encabezado del tema:

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

Actualmente todo lo que veo es " Nope " y " Función NO encontrada " ;. Gracias por cualquier aportación.

Lee,

¿Fue útil?

Solución

Para empezar, " imagerotator_show " no es una función; Es el nombre de un tipo de acción. Cuando usa la función add_action (), Wordpress simplemente agrega su método a la lista de funciones / métodos para llamar cuando se activa una acción en particular. Por lo tanto, su segunda prueba siempre responderá con 'Función NO encontrada'.

La causa más probable del primer problema es no declarar el método al que desea llamar como método público. También está haciendo que el código sea más difícil de lo necesario.

La mejor práctica que he visto para declarar métodos y registrar ganchos de una clase se parece a esto:

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();

Esto permite que su clase mantenga todos sus detalles de implementación privados. Cuando necesite llamar a my_special_method (), hágalo de la siguiente manera:

$MyFoo->my_special_method();

Otros consejos

@andrew ya que no puedo comentar, pensé que respondería tu pregunta complementaria. Ver:

http://net.tutsplus.com / tutoriales / wordpress / create-wordpress-plugins-with-oop-technologies /

Donde se explica que al definir una función de devolución de llamada a partir de un objeto, debe usar la función de matriz. Básicamente dice que obtenga la función 'my_hook_implementation' del objeto $ this y úsela como parámetro de devolución de llamada para el gancho de acción de agregar. Es porque usted definió la función dentro del alcance del objeto y tiene que definir el alcance para que PHP sepa de qué función está hablando. El alcance es el objeto al que hace referencia la variable $ this.

Solo necesita usar la función do_action(), dentro de su tema.

Si desea que la función generateHtml aparezca dentro de su header.php solo necesita abrir el archivo header.php y pegar <?php do_action('imagerotator_show'); ?> donde lo desee y luego se llamará a su función allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top