我的WordPress“小部件”有问题.尝试 ping 我的世界服务器以查看它是否在线


Having issues with my wordpress "widget" .. Trying to ping a minecraft server to see if it is online

所以我一直在尝试为wordpress编写这个小部件,以检查我在本地托管的Minecraft服务器是否在线。我正在为我的网站使用托管,只是我的代码有一点问题,我不确定如何解决它。

<?php

define('PLUGIN_URL', plugin_dir_url( __FILE__ ));
add_action("widgets_init", array('sc_status', 'register'));
register_activation_hook( __FILE__, array('sc_status', 'activate'));
register_deactivation_hook( __FILE__, array('sc_status', 'deactivate'));
class sc_status {
function activate(){
        $scdata = array( 'option1' => 'Default value' ,'option2' => 55);
        if ( ! get_option('sc_status')){
            add_option('sc_status' , $scdata);
        } else {
              update_option('sc_status' , $scdata);
        }
}
function deactivate(){
        delete_option('sc_status');
}
function control(){
        $scdata = get_option('sc_status');
    ?>
        <p><label>Title : <input name="widget_title" type="text" value="<?php echo $scdata['widget_title']; ?>" /></label></p>
        <p><label>IP : <input name="server_ip" type="text" value="<?php echo $scdata['server_ip']; ?>" /></label></p>
        <p><label>Port (25565) : <input name="server_port" size="5"  type="text" value="<?php echo $scdata['server_port']; ?>" /></label></p>
    <?php
        if (isset($_POST['server_ip'])){
        $scdata['widget_title'] = attribute_escape($_POST['widget_title']);
        $scdata['server_ip'] = attribute_escape($_POST['server_ip']);
        $scdata['server_port'] = attribute_escape($_POST['server_port']);
        update_option('sc_status', $scdata);
    }
}
function widget($args){

          wp_enqueue_style('sc', PLUGIN_URL.'/css/sc_button.css');
          $scdata = get_option('sc_status');
          $title = $scdata['widget_title'];
          $port = $scdata['server_port'];
          if(empty($port)) {
              $port = "25565";
          }
        echo $args['before_widget'];
        if(!empty($title)) {
            echo $args['before_title'] . $title . $args['after_title'];
        }
        // Check Server Status
        $waitTimeoutInSeconds = 1; 
        if($fp = fsockopen($scdata['server_ip'],$port,$errCode,$errStr,$waitTimeoutInSeconds)){   
           // It worked 
           echo '<div class="btn btn-success" rel="tooltip" title="first tooltip">online</div>';
        } else {
           // It didn't work 
           echo '<div class="btn btn-danger">offline</div>';
        } 
        fclose($fp);

        // End
        echo $args['after_widget'];
  }
  function register(){
        register_sidebar_widget('Servercraft Status', array('sc_status', 'widget'));
        register_widget_control('Servercraft Status', array('sc_status', 'control'));
  }
}

这适用于"大多数"部分..它遇到的问题是错误是:

警告:fsockopen() [function.fsockopen]:无法连接到第 62 行(不想发布 ip)(连接超时)

然后

它像它应该的那样发布"离线"div..然后是

警告:fclose() 期望参数 1 是资源,在第 69 行给出布尔值

所以希望有人可以告诉我我做错了什么或如何解决它。

编辑!这是我从上述部分完成几个修复后的代码。我仍然遇到的问题是服务器仍然反馈到它离线的站点。根本不是。

<?php
define('PLUGIN_URL', plugin_dir_url( __FILE__ ));
add_action("widgets_init", array('sc_status', 'register'));
register_activation_hook( __FILE__, array('sc_status', 'activate'));
register_deactivation_hook( __FILE__, array('sc_status', 'deactivate'));
class sc_status {
function activate(){
        $scdata = array( 'option1' => 'Default value' ,'option2' => 55);
        if ( ! get_option('sc_status')){
            add_option('sc_status' , $scdata);
        } else {
              update_option('sc_status' , $scdata);
        }
}
function deactivate(){
        delete_option('sc_status');
}
function control(){
        $scdata = get_option('sc_status');
    ?>
        <p><label>Title : <input name="widget_title" type="text" value="<?php echo $scdata['widget_title']; ?>" /></label></p>
        <p><label>IP : <input name="server_ip" type="text" value="<?php echo $scdata['server_ip']; ?>" /></label></p>
        <p><label>Port (25565) : <input name="server_port" size="5"  type="text" value="<?php echo $scdata['server_port']; ?>" /></label></p>
    <?php
        if (isset($_POST['server_ip'])){
        $scdata['widget_title'] = attribute_escape($_POST['widget_title']);
        $scdata['server_ip'] = attribute_escape($_POST['server_ip']);
        $scdata['server_port'] = attribute_escape($_POST['server_port']);
        update_option('sc_status', $scdata);
    }
}
function widget($args){

          wp_enqueue_style('sc', PLUGIN_URL.'/css/sc_button.css');
          $scdata = get_option('sc_status');
          $title = $scdata['widget_title'];
          $port = $scdata['server_port'];
          if(empty($port)) {
              $port = "25565";
          }
        echo $args['before_widget'];
        if(!empty($title)) {
            echo $args['before_title'] . $title . $args['after_title'];
        }

        // Check Server Status
        $waitTimeoutInSeconds = 1;
        $fp = @fsockopen($scdata['server_ip'],$port,$errCode,$errStr,$waitTimeoutInSeconds);
        echo "<span class='sc_status'> IP : ".$scdata['server_ip']."</span>";
        if($fp){                
            // It worked 
            echo '<div class="btn btn-success" rel="tooltip" title="first tooltip">online</div>';
            fclose($fp);
        } else {
            // It didn't work 
            echo '<div class="btn btn-danger">offline</div>';
        } 


        // End
        echo $args['after_widget'];
  }
  function register(){
        register_sidebar_widget('Servercraft Status', array('sc_status', 'widget'));
        register_widget_control('Servercraft Status', array('sc_status', 'control'));
  }
}

?>

非常简单的解决方案:

if($fp = @fsockopen($scdata['server_ip'],$port,$errCode,$errStr,$waitTimeoutInSeconds)){   
 //it worked
 fclose($fp);
}          

您只需使用 @ 隐藏错误消息。并且仅在连接打开时关闭连接(因此fclose($fp);移动到"它工作"部分)。