最終的な状態:Nathan Johnsonが述べたように、私は自分のプラグインをクラスに変更しますが、それでもincrement_like関数でpost idを使用することはできません...
<?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' ] );
?>
私がやりたいのは、グローバル変数を使用しないことです。
これは3つのメソッドと1つのプロパティを使用してthe_post
にフックし、フッターに投稿IDをエコーする単純なクラスです。
/**
* 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' ] );
ええ、それはwp_ajax_ *がthe_postの前に起動するからです。私はその質問の2番目の答えで解決策を見つけました: wp_ajax関数でpost_idを得る
$url = wp_get_referer();
$post_id = url_to_postid( $url );