webentwicklung-frage-antwort-db.com.de

Wie ändere ich eine globale Variable in einer Funktion und verwende sie für eine andere Funktion?

Endgültiger Zustand: Wie Nathan Johnson feststellte, ändere ich mein Plug-in in eine Klasse, kann jedoch die Post-ID in der Funktion increment_like nicht verwenden ...

<?php .... //irrelevant parts skipped
class wpse_263293 {
    protected $ID;

    //* Add actions on init
    public function init() {
    add_action( 'the_post', [ $this, 'createLikeButton' ] );
    add_action( 'wp_footer', [ $this, 'footer' ] );
    add_action('wp_enqueue_scripts',[ $this ,'button_js']);
    add_action('wp_ajax_increment_like', [$this,'increment_like']);
    add_action('wp_ajax_no_priv_increment_like',[$this,'increment_like']);
}

public function footer() {
//* Print the ID property in the footer
echo $this->ID; //This one works
}
public function createLikeButton( $post ) {

  $this->ID = $post->ID;
  $myId=$post->ID;
  echo "<button onclick=\"likeButton()\" p style=\"font-size:10px\" id=\"likeButton\">LIKE</button>";
}
public function button_js(){
    wp_enqueue_script( 'likeButton', plugins_url( '/like.js', __FILE__ ),array('jquery'));
    wp_localize_script('likeButton', 'my_ajax_object', array( 'ajax_url' =>admin_url('admin-ajax.php')));
    wp_localize_script('likeButton', 'new_ajax_object', array( 'ajax_url' =>admin_url('admin-ajax.php')));
}

public function increment_like() {

    echo $this->ID."test"; //I only see test
    /* irrelevant code*/

}

}
//* Initiate the class and hook into init
add_action( 'init', [ $wpse_263293 = new wpse_263293(), 'init' ] );
?>
1
codemonkey

Ich würde es so machen, dass ich nicht globale Variablen verwende.

Dies ist eine einfache Klasse, die 3 Methoden und 1 Eigenschaft verwendet, um sich in the_post einzuhängen und die Beitrags-ID in der Fußzeile wiederzugeben.

/**
 * Plugin Name: WPSE_263293 Example
 */

class wpse_263293 {
  protected $ID;

  //* Add actions on init
  public function init() {
    add_action( 'the_post', [ $this, 'the_post' ] );
    add_action( 'wp_footer', [ $this, 'footer' ] );
  }
  public function the_post( $post ) {
    //* Only do this once
    remove_action( 'the_post', [ $this, 'the_post' ] );

    //* This is the property we're interested in
    $this->ID = $post->ID;
  }
  public function footer() {
    //* Print the ID property in the footer
    echo $this->ID;
  }
}
//* Initiate the class and hook into init
add_action( 'init', [ $wpse_263293 = new wpse_263293(), 'init' ] );
0
Nathan Johnson

Ja, das liegt daran, dass wp_ajax_ * vor dem Beitrag ausgelöst wird. Bei der zweiten Antwort auf diese Frage habe ich die Lösung gefunden: Die post_id in der Funktion wp_ajax abrufen

 $url     = wp_get_referer();
 $post_id = url_to_postid( $url ); 
0
codemonkey