function sp_enqueue_scripts() {
  wp_enqueue_script( 'jquery' );
}
add_action( 'init', 'sp_enqueue_scripts' );



<?php
// Frontend JavaScriptu
function sp_wp_enqueue_scripts() {
    wp_enqueue_script( 'jquery' );
    wp_enqueue_script(
        'schoolpress-plugin-frontend',
        plugins_url( 'js/frontend.js', __FILE__ ),
        array( 'jquery' ),
        '1.0'
   );
}
add_action( "wp_enqueue_scripts", "sp_wp_enqueue_scripts" );

// Sekcja administracyjna JavaScriptu
function sp_admin_enqueue_scripts() {
    wp_enqueue_script(
        'schoolpress-plugin-admin',
        plugins_url( 'js/admin.js', __FILE__ ),
        array( 'jquery' ),
        '1.0'
    );
}
add_action( 'admin_enqueue_scripts', 'sp_admin_enqueue_scripts' );
?>



function my_wp_head_ajax_url()
{
?>
<script type=”text/JavaScript”>
var ajaxurl = '<?php echo admin_url("admin-ajax.php");?>';
</script>
<?php
}
add_action('wp_head', 'my_wp_head_ajax_url');



<?php
// Kod JavaScript przeznaczony dla strony
function my_wp_footer_registration_JavaScript()
{
    // Upewniamy się, czy bieżąca strona to strona rejestracji konta użytkownika
    if(empty($_REQUEST['action']) || $_REQUEST['action'] != 'register')
        return;
?>
<script>
    // Oczekiwanie na wczytanie modelu DOM
    jQuery(document).ready(function() {
        // Zmienna przechowująca czas
        var timer_checkUsername;
        // Sprawdzenie, czy wartość pola user_login uległa zmianie
        jQuery('#user_login').bind.('keyup change', function() {
            // Użycie wartości czasu do wywołania operacji sprawdzenia po upływie sekundy od podania nazwy użytkownika
            timer_checkUsername = setTimeout(function(){checkUsername();}, 1000);
        });
        });

    function checkUsername()
    {
        // Zagwarantowanie, że nazwa użytkownika istnieje
        var username = jQuery('#user_login').val();
        if(!username)
            return;

        // Sprawdzenie nazwy użytkownika
        jQuery.ajax({
        url: ajaxurl,type:'GET',timeout:5000,
                dataType: 'html',
                data: "action=check_username&username="+username,
                error: function(xml){
                        // Przekroczenie czasu oczekiwania, ale nie ma potrzeby niepokojenia użytkownika
                },
                success: function(response){
                // Ukrycie wszystkich opcji, które mogły być wyświetlone
                jQuery('#username_check').remove();
                // Wyświetlenie informacji o dostępnej (1) lub zajętej nazwie użytkownika (0)
                if(response == 1)
                    jQuery('#user_login').after(
                     '<span id="username_check" class="okay">Nazwa użytkownika jest dostępna</span>'
                    );
                else
                    jQuery('#user_login').after(
                     '<span id="username_check" class="taken">Nazwa użytkownika jest zajęta</span>'
                    );
                }
        });
    }
</script>
<?php
}
add_action('wp_footer', 'my_wp_footer_registration_JavaScript');
?>



<?php
// Wykrycie żądania AJAX dla check_username
function wp_ajax_check_username() {
    global $wpdb;
    $username = $_REQUEST['username'];

    $taken = username_exists( $username );

    if ( $taken )
        echo "0";   // Nazwa użytkownika jest zajęta
    else
        echo "1";   // Nazwa użytkownika jest dostępna
}
add_action( 'wp_ajax_check_username', 'wp_ajax_check_username' );
add_action( 'wp_ajax_nopriv_check_username', 'wp_ajax_check_username' );
?>



// Opcja #1: wyłączenie przycisku podczas przetwarzania żądania AJAX
jQuery('#button').click(function() {
    // Wyłączenie przycisku
    jQuery(this).attr('disabled', 'disabled');

    // Wykonanie żądania AJAX
    jQuery.ajax({
        url: ajaxurl,type:'GET',timeout:5000,
        dataType: 'html',
        error: function(xml){
            // Polecenia przeznaczone do obsługi błędów
        },
        success: function(response){
            // Polecenia przeznaczone do wykonania w przypadku sukcesu operacji
        }
        complete: function() {
            // Ponowne włączenie przycisku
            jQuery('#button').removeAttr('disabled');
        }
    });
});



// Opcja #2: anulowanie starego żądania AJAX po pojawieniu się nowego
var ajax_request;
jQuery('#button').click(function() {
    // Anulowanie wszelkich istniejących żądań AJAX
    if(typeof ajax_request !== 'undefined')
        ajax_request.abort();

    // Wykonanie żądania AJAX
    ajax_request = jQuery.ajax({
        url: ajaxurl,type:'GET',timeout:5000,
        dataType: 'html',
        error: function(xml){
            // Polecenia przeznaczone do obsługi błędów
        },
        success: function(response){
            // Polecenia przeznaczone do wykonania w przypadku sukcesu operacji
        }
    });
});



// Zagwarantowanie użycia heartbeat.js i kodu JavaScript
function hbdemo_init()
{
    /*
    // Dodanie danych uwierzytelniających, aby można było np. wyświetlać dowolne strony
    if(is_admin())
        return;         // Nie wykonuj tego kodu, jeśli użytkownik jest administratorem
    */
    // Zapewnienie możliwości użycia API Heartbeat
    wp_enqueue_script('heartbeat');
    
    // Wczytanie kodu JavaScript w stopce strony
    add_action("wp_footer", "hbdemo_wp_footer");
}
add_action('init', 'hbdemo_init');



<?php
// Kod JavaScript odpowiedzialny za wysyłanie i przetwarzanie danych po stronie klienta
function hbdemo_wp_footer()
{
?>
<script>
  jQuery(document).ready(function() {
        // Użycie zaczepu heartbeat-send: klient wysyła komunikat
        //'marco' w zmiennej 'client' wewnątrz tablicy data
        jQuery(document).on('heartbeat-send', function(e, data) {
                console.log('Klient: marco');

                // Potrzebne są pewne dane do wykonania żądania AJAX
                data['client'] = 'marco';
        });

        // Użycie zaczepu heartbeat-tick: klient szuka zmiennej 'server'
        // w tablicy data, a następnie wyświetla jej wartość w konsoli
        jQuery(document).on('heartbeat-tick', function(e, data) {
                if(data['server'])
                        console.log('Serwer: ' + data['server']);
        });

        // Zaczep heartbeat-error przeznaczony do obsługi błędów
        jQuery(document).on('heartbeat-error',
                function(e, jqXHR, textStatus, error) {
                        console.log('POCZĄTEK BŁĘDU');
                        console.log(textStatus);
                        console.log(error);
                        console.log('KONIEC BŁĘDU');
                });
  });
</script>
<?php
}
?>



// Przetwarzanie komunikatu po stronie serwera
function hbdemo_heartbeat_received($response, $data)
{
    if($data['client'] == 'marco')
        $response['server'] = 'polo';

    return $response;
}
add_filter('heartbeat_received', 'hbdemo_heartbeat_received', 10, 2);



?>
<div>
    Odesłane:
    <span id="assignment_count">
        <?php echo count($assignment->submissions);?>
    </span>
    /
    <?php echo count($course->students);?>
</div>
<?php



function sp_init_assignments_heartbeat()
{
    // Zignorowanie kodu, jeśli bieżąca strona nie jest stroną pracy domowej
    if(strpos($_SERVER['REQUEST_URI'], "/assignment/") === false)
        return;

    // Zapewnienie możliwości użycia API Heartbeat
    wp_enqueue_script('heartbeat');

    // Wczytanie kodu JavaScript w stopce strony
    add_action("wp_footer", "sp_wp_footer_assignments_heartbeat");
}
add_action('init', 'sp_init_assignments_heartbeat');



<?php
function sp_wp_footer_assignments_heartbeat()
{
    global $post;   // Zmienna globalna dla bieżącej pracy domowej
?>
<script>
jQuery(document).ready(function() {
  // Zdarzenie heartbeat-send
  jQuery(document).on('heartbeat-send', function(e, data) {
        // Upewniamy się o istnieniu tablicy schoolpress w tablicy data
  if(!data['schoolpress'])
    data['schoolpress'] = new Array();

  // Przekazanie do serwera wartości post_id danej pracy domowej i liczby bieżących zadań do wykonania
  data['schoolpress']['assignment_post_id'] = '<?php echo $post->ID;?>';
  data['schoolpress']['assignment_count'] = jQuery('#assignment-count').val();
  });

  // Zdarzenie heartbeat-tick
  jQuery(document).on('heartbeat-tick', function(e, data) {
        // Uaktualnienie liczby pozostałych zadań
  if(data['schoolpress']['assignment_count'])
        jQuery('#assignment-count').val(data['schoolpress']['assignment_count']);
  });
});
</script>
<?php
}
?>



// Przetwarzanie komunikatu po stronie serwera
function sp_heartbeat_received_assignment_count($response, $data)
{
    // Sprawdzenie identyfikatora posta pracy domowej
    if(!empty($data['schoolpress']['assignment_post_id']))
    {
        $assignment = new Assignment(
            $data['schoolpress']['assignment_post_id']
        );
        $response['schoolpress']['assignment_count'] = count(
            $assignment->submissions
        );
    }
    return $response;
}
add_filter('heartbeat_received',
    'sp_heartbeat_received_assignment_count', 10, 2);



function sp_heartbeat_settings($settings = array())
{
    $settings['interval'] = 20;  // 20 sekund zamiast domyślnych 15
    return $settings;
}
add_filter('heartbeat_settings', 'sp_heartbeat_settings');



