0

だから私はワードプレス用にこのウィジェットを書いて、ローカルでホストされている私の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'));
  }
}

?>

4

1 に答える 1

0

非常に簡単な解決策:

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

@ でエラー メッセージを非表示にするだけです。そして、接続が開いているときにのみ接続を閉じます(したがってfclose($fp);、「機能した」セクションに移動してください)。

于 2013-01-30T23:38:45.180 に答える