如何从插件PHP传递参数(数据)以做出反应

时间:2017-06-26 作者:Gilbert Mizrahi

我正在尝试使用create react应用程序创建WordPress插件。为了让事情变得简单,我正在尝试开发一个点击推特插件。

短代码部分(在PHP中)如下所示:

// Shortcode to output needed markup
add_shortcode( \'react_click_to_tweet\', \'react_click_to_tweet_test\' );
function react_click_to_tweet_test($atts = [], $content = null, $tag = \'\') {
    return \'<div id="root" data=\' . $content . \'></div>\';
}

function include_react_files() {
  wp_enqueue_style( \'prefix-style\', plugins_url(\'css/main.ae114d0c.css\', __FILE__) );

  // add the JS file to the footer - true as the last parameter
  wp_enqueue_script( \'plugin-scripts\', plugins_url(\'js/main.d8745ba2.js\', __FILE__),array(),  \'0.0.1\', true );
}

add_action( \'wp_enqueue_scripts\', \'include_react_files\' );
$content应该是我想要传递的推文文本,其短代码为:

[react_click_to_tweet]TEXT TO TWEET[/react_click_to_tweet]
索引。js有:

ReactDOM.render(<App />, document.getElementById(\'root\'));
registerServiceWorker();
但这不起作用。有什么建议吗?

此外,aI如何传递$ATT以传递例如属性以在运行时修改CSS?

[编辑]根据Paul Burilichev和belinus的建议,我做了以下修改:

我试过他们的方法WP AJAX 对于带参数的短代码。我试过:

add_shortcode( \'react_click_to_tweet\', \'react_click_to_tweet_test\' ); 
function react_click_to_tweet_test($atts = [], $content = null, $tag = \'\') {
  $o = \'\'; 
  $o .= \'<div id="tweet" >\'; 
  if (!is_null($content)) {
    $o .= apply_filters(\'content\', $content);
    // run shortcode parser recursively
    $o .= do_shortcode($content);
  }
  // end box
  $o .= \'</div>\'; 
  return $o; //\'<div id="root" ></div>\';
} 
但是,它不起作用。我错过了什么?

然后,我尝试:

function include_react_files() {
  wp_enqueue_style( \'prefix-style\', plugins_url(\'css/main.ae114d0c.css\', __FILE__) );

  // add the JS file to the footer - true as the last parameter
  wp_register_script( \'plugin-scripts\', plugins_url(\'js/main.d8745ba2.js\',  __FILE__),array(),  \'0.0.1\', true );
  $data = array( 
    \'text\' => $content, // I also tried passing a string \'some content goes here\'
    \'key2\' =? \'value2\',
  );
  wp_localize_script( \'plugin-scripts\', \'wp_object\', $data );
  wp_enqueue_script( \'plugin-scripts\' );
}

add_action( \'wp_enqueue_scripts\', \'include_react_files\' );
但我的应用程序组件上无法识别对象。我想我还是错过了一些东西。我的索引。js看起来像:

import React from \'react\'; 
import ReactDOM from \'react-dom\'; 
import App from \'./App\'; 
import registerServiceWorker from \'./registerServiceWorker\'; 
import \'./index.css\'; 

//const data = "This is some cool stuff"; 
ReactDOM.render( 
  <App />, document.getElementById(\'root\')); 
registerServiceWorker();
这是我的应用程序。js公司:

import React, { Component } from \'react\';
import \'./App.css\';

class App extends Component {
  render() {
    const page = window.location.href;
    let data = page+\'&text=\'+ wp_object.text;
    let twiiterUrl = "https://"+"twitter.com/intent/tweet?url=";
    let URL = twiiterUrl+data;

     //console.log(wp_object.text);
     return (
      <div className="App">
        <div className="tm-click-to-tweet">
            <div className="tm-ctt-text">
                <a href={URL} target="_blank">{wp_object.text} </a>
            </div>
            <a href={URL} className="tm-ctt-btn" target="_blank">Click To Tweet</a>
            <div className="tm-ctt-tip"></div>
            <div className="clear"></div>
        </div>
      </div>
    );
  }
}

export default App;
它不识别wp\\u对象;

4 个回复
SO网友:Cedon

WordPress有一个功能,wp_localize_script() 可以做到这一点。您可以创建一个要在JavaScript文件中访问的值数组,然后将其作为对象注入。

您可以这样修改您的排队函数:

function include_react_files() {
  wp_enqueue_style( \'prefix-style\', plugins_url(\'css/main.ae114d0c.css\', __FILE__) );

  // add the JS file to the footer - true as the last parameter
  wp_register_script( \'plugin-scripts\', plugins_url(\'js/main.d8745ba2.js\', __FILE__),array(),  \'0.0.1\', true );
  $data = array( 
     \'key1\' => \'value1\',
     \'key2\' =? \'value2\',
  );
  wp_localize_script( \'plugin-scripts\', \'object\', $data );
  wp_enqueue_script( \'plugin-scripts\' );
}

add_action( \'wp_enqueue_scripts\', \'include_react_files\' );
然后要访问这些数据,您只需执行以下操作object.key1, object.key2, 等等,所以console.log( object.key1 ); 将回音value1.

SO网友:Leandro Albin

也许是晚些时候,但是。。。您必须访问window对象才能访问全局变量。

因此,示例代码是:

<a href={URL} target="_blank">{window.wp_object.text} </a>

供参考:https://facebook.github.io/create-react-app/docs/using-global-variables

SO网友:Paul Burilichev

我警告说,下一个方法将停止WP编码符号和样式,但为了测试目的和快速入门,您可以将想要的参数直接包含到模板文件中,模板文件放在模板目录中,您知道。

另一种方法是使用WP-AJAX。我的最后一个项目就是用这种方法创建的。我肯定,你知道我在说什么。有关的更多信息WP AJAX. 但在这里,要仔细调查Ajax对未经授权访问者的可用性请求(未登录admin!)其中包括通过特定挂钩开始wp_ajax_nopriv_.

不要犹豫,提出问题。

SO网友:Sdaland2

我为此挣扎了一段时间。我能想到的最好的解决方案是在我的create-react应用程序中创建一个JSON文件,然后让wordpress写入它。我希望这对某人有所帮助。

我在插件激活时运行这个

function json_config_file() {

        $file = plugin_dir_path( __DIR__ ).\'PATH_TO_REACT_SRC_FOLDER/wordpress.json\';

        $json = array(
            key=> value
        );

        $fp = fopen($file, \'w\');
        fwrite($fp, json_encode($json));
        fclose($fp);
    }
然后在我的应用程序中。js我可以打电话

let wordpress = require(\'./wordpress.json\');
并使用调用值

console.log(wordpress.value)

结束

相关推荐

Plugins_url()错误地返回wp-Include目录

我怀疑它有问题plugins_url() 但我看到的是一些奇怪的行为。我在激活的插件中有以下内容function include_masonry() { wp_enqueue_script( \'masonry\', plugins_url(\'js/masonry.min.js\', __FILE__), array(), \'3.2.1\', true ); wp_enqueue_script( \'my_init_script\', plugins_url(\'js/my_i