如何基于TinyMCE切换按钮禁用/启用PHP插件功能

时间:2019-01-12 作者:styx

我目前正在开发一个插件,它可以在每次发布帖子时将WP帖子发送给用户指定的REST API。

问题:我不想发送所有帖子,我希望用户选择是否发送(默认:不发送)。

因此,我的插件PHP文件如下所示(摘录):

function post_published_api_call( $ID, $post) {

    $url = get_option(\'api_url\', array(\'plugin_text_string\' => DEFAULT_API_URL))[\'plugin_text_string\'];
    $title = $post->post_title;
    $content = wp_post_to_html($post->post_content);

    $post_data = array(
        \'status\' => \'publish\',
        \'title\' => $title,
        \'content\' => $content
    );

    $json_post = json_encode($post_data);

    $data = wp_remote_post($url, array(
        \'headers\' => array(\'Content-Type\' => \'application/json; charset=utf-8\'),
        \'body\' => $json_post,
        \'method\' => \'POST\'
    ));
}
add_action( \'publish_post\', \'post_published_api_call\', 10, 2);
wp_remote_post (或更好:整体post_published_api_call 功能)应仅在按下/激活TinyMCE中的自定义按钮时启动。

我的自定义TinyMCE编辑器按钮(pb\\u Button.js):

(function() {

tinymce.create(\'tinymce.plugins.pboerse\', {

    init : function(ed, url) {
        var state;

        ed.addButton(\'pb_button1\', {
            text : \'PB\',
            title : \'Publish on Projektboerse?\',
            cmd : \'pb_button1\',

            onclick: function () {


            },

            onpostrender: function() {
                var btn = this;
                ed.on(\'pb_button1\', function(e) {
                    btn.active(e.state);
                });
            }
        });



        ed.addCommand(\'pb_button1\', function() {

            state = !state; /* Switching state */
            ed.fire(\'pb_button1\', {state: state});

            if (state){
                /* Button active */
                var request = new XMLHttpRequest();
                request.open(\'POST\', \'projektboerse.php\', true);
                request.setRequestHeader(\'Content-Type\', \'application/x-www-form-urlencoded\');
                request.send(\'mydata=\'+state);
            }
            else {
                /* Button inactive */
            }

        });

    }
});

// Register plugin
tinymce.PluginManager.add( \'pboerse\', tinymce.plugins.pboerse );
})();
我知道在服务器端语言(如PHP)和客户端语言(如JavaScript)之间交换状态/变量的困难。

我在google上搜索了很多关于AJAX的内容,但仍然存在一个问题:我可以通过以下代码获得按钮状态

foo = isset($_POST[\'mydata\']);

if (isset($_POST[\'mydata\'])){
   $GLOBALS[\'foo\'] = $_POST[\'mydata\'];
   echo $foo;
   wp_die();
}
但是按钮状态只存在于if语句中,因为我猜插件的其余部分仍然获得了初始默认值(这是一个空字符串)。

我试着在post_published_api_call 函数,但此时$\\u POST变量似乎被wordpress覆盖,等等$_POST[\'mydata\'] 结果为空字符串。

如何检查post_published_api_call 作用有可能吗?

提前感谢!

1 个回复
最合适的回答,由SO网友:Nour Edin Al-Habal 整理而成

我不确定您是否可以直接使用TinyMCE进行编辑,因为它只是一个编辑器,可以修改正在编辑的帖子的内容,并且不会影响保存操作本身。然而,有一个解决方法。

解决方法:在编辑页面中添加一个隐藏字段
  • 使用TinyMCE按钮修改它
  • 读入post_published_api_call
    1. 如前所述添加字段here, 使用post_submitbox_misc_actions 钩子您可以将字段添加到“发布”元框。在您的情况下,您将添加一个隐藏的,如下所示:

      add_action( \'post_submitbox_misc_actions\', \'wpse325418_my_custom_hidden_field\' );
      function wpse325418_my_custom_hidden_field() {
          echo "<input id=\'i-am-hidden\' name=\'publish-to-somewhere\' type=\'hidden\' />";
      }
      
      TinyMCE按钮只有一个用途,即设置/清除隐藏字段。假设您的JS代码正常工作,我只需修改addCommand 其中一部分:

          ed.addCommand(\'pb_button1\', function() {
      
              state = !state; /* Switching state */
              ed.fire(\'pb_button1\', {state: state});
      
              if (state){
                  /* Button active */
                  document.getElementById("i-am-hidden").value = "1";
              }
              else {
                  /* Button inactive */
                  document.getElementById("i-am-hidden").value = "0";
              }
      
          });
      
      读取字段,我们将修改您的post_published_api_call 根据隐藏字段的值进行操作的函数:

      function post_published_api_call( $ID, $post) {
          if(!isset($_POST[\'publish-to-somewhere\'])) return;
          if($_POSt[\'publish-to-somewhere\'] == \'0\') return;
      
          $url = get_option(\'api_url\', array(\'plugin_text_string\' => DEFAULT_API_URL))[\'plugin_text_string\'];
          $title = $post->post_title;
          $content = wp_post_to_html($post->post_content);
      
          $post_data = array(
              \'status\' => \'publish\',
              \'title\' => $title,
              \'content\' => $content
          );
      
          $json_post = json_encode($post_data);
      
          $data = wp_remote_post($url, array(
              \'headers\' => array(\'Content-Type\' => \'application/json; charset=utf-8\'),
              \'body\' => $json_post,
              \'method\' => \'POST\'
          ));
      }
      add_action( \'publish_post\', \'post_published_api_call\', 10, 2);
      

    相关推荐

    Select2 AJAX和WP查询返回全部,不筛选

    所以我在这里有点困惑。我经常使用Select2/AJAX/WP\\u查询来搜索和检索默认的WP帖子类型和我自己的自定义帖子类型。在过去几年中,我构建的几乎每个站点都至少包含一个实现。但是,我目前正在一个网站上搜索自定义帖子类型的结果,它只是返回所有内容。没有发生过滤。这是一个计划工具,管理员正在为一年中的每个月制定一个计划(自定义帖子类型)。时间表的标题为“月-年”,即。\'January 2022\'.问题是,如果您搜索“一月”,例如,您将得到返回的每个存在的时间表。包括2022年2月、2021 6月等