Wsparcie » Używanie i konfiguracja WordPressa » jQuery i ajax nie działa

  • Rozwiązany cimek69

    (@cimek69)


    Witam,
    mam problem z odwołaniem do funkcji na serwerze przez ajax.
    1. Dodanie w functions.php linijki
    wp_enqueue_script(’jquery');
    nie umożliwia korzystania z jQuery, muszę dodać linijkę
    wp_enqueue_script(’HANDLE1′, 'http://code.jquery.com/jquery-3.1.1.min.js');

    2. Nie działa wywołanie $.post. Po prostu nie wywołuje akcji, prawdopodobnie nie uruchamia admin-ajax.php i nie wiem dlaczego.

    Wywołanie funkcji js AktualizujDane działa prawidłowo do momentu $.post

    Co pominąłem? Proszę o pomoc i z góry dziękuję 😉
    Tomek

    functions.php:
    add_action(’wp_ajax_zapisz_subskrypcje', 'ZapiszSubskrypcje');
    add_action(’wp_ajax_nopriv_zapisz_subskrypcje', 'ZapiszSubskrypcje');

    add_action(’wp_enqueue_scripts', 'jj_enqueue_ajax_scripts');

    function jj_enqueue_ajax_scripts() {

    wp_enqueue_script(’HANDLE1′, 'http://code.jquery.com/jquery-3.1.1.min.js');
    wp_enqueue_script(’jquery');

    //nasz plik z którego wyślemy zapytanie
    wp_enqueue_script(’myscripts', get_template_directory_uri() . '/js/aktualizujsubskrypcje.js', __FILE__);

    //ustalamy odpowiedni protokół
    if (isset($_SERVER[’HTTPS']))
    $protocol = 'https://';
    else
    $protocol = 'http://';

    //pobieramy adres do pliku admin-ajax.php
    $admin_ajax_url = admin_url(’admin-ajax.php', $protocol);

    //za pomocą tej funkcji przekazujemy zmienną zawierająca adres, do javascript
    wp_localize_script(’myscripts', 'ajax_options', array(’admin_ajax_url' => $admin_ajax_url));
    }

    function ZapiszSubskrypcje() {
    if (isset($_POST[’userid'])) {
    $userid = $_POST[’userid'];
    }
    if (isset($_POST[’sdataod'])) {
    $sdataod = $_POST[’sdataod'];
    }
    if (isset($_POST[’sdatado'])) {
    $sdatado = $_POST[’sdatado'];
    }
    ?>
    <script>
    alert(’Jestem w aktualizacji');
    </script>
    <?php
    update_user_meta($userid, 'subskrypcja_od', $sdataod);
    update_user_meta($userid, 'subskrypcja_do', $sdatado);

    $sukces = TRUE;

    if ($sukces) {
    print (json_encode([
    'sukces' => TRUE
    ]));
    } else {
    print (json_encode([
    'sukces' => FALSE
    ]));
    }
    die();
    }

    aktualizujsubskrypcje.js:

    function AktualizujDane(id, wywolanie_zapisania) {
    var userid = id;
    //var dataod = 'od—>';
    //var datado = '—>do';
    //var dataod = document.getElementsByName(’sod' + id)[0].value;
    //var datado = document.getElementsByName(’sdo' + id)[0].value;
    var dataod = $(’#sod' + id).val();
    var datado = $(’#sdo' + id).val();

    alert(dataod + ' ' + datado);

    var data = {
    'action': 'zapisz_subskrypcje',
    'puserid': userid,
    'psdataod': dataod,
    'psdatado': datado

    }

    alert(ajax_options.admin_ajax_url);

    $.post(ajax_options.admin_ajax_url, data,
    function (response) {
    if (response.sukces === true)
    alert(’OK');
    else
    alert(’Czapa');

    }
    );

    }

    Strona przy której potrzebuję pomocy: [zaloguj się aby zobaczyć ten link]

Viewing 2 replies - 1 through 2 (of 2 total)
  • Nie zgadzają Ci się nazwy pól pobieranych z formularza i wysyłanych do funkcji, z tymi pobieranych przez funkcje do tablicy $_POST:

    W js masz:

    'puserid': userid,
    'psdataod': dataod,
    'psdatado': datado

    A we funkcji ZapiszSubskrypcje masz:

    if (isset($_POST[’userid'])) {
    $userid = $_POST[’userid'];

    Wysyłasz puserid a odbierasz userid.

    To by była pierwsza rzecz do poprawienia.

    Jeżeli przypiszesz zmiennej $sukces = TRUE;, przed tym jak sprawdzisz, czy jest True,
    if ($sukces) {
    to funkcja zawsze będzie Ci zwracać:

    	print (json_encode([
    	'sukces' => TRUE
    	]));

    Poza tym, niczemu to nie służy. No bo, co daje Ci taki zabieg?
    Jaki warunek chcesz sprawdzić?
    Czy update_user_meta zostało zaktualizowane?
    Czy do innego warunku się odnosisz?
    W tym momencie on nic nie robi poza zwróceniem błędu.

    Do obsługi formularza użyj takiego układu:

    try {
    	// jakiś warunek
    if (  empty( $_POST['email'] ) ) {
    	//throw new Exception('Puste pola.');
    	echo json_encode( array( 'message' => 'Puste pola.' ));
    	exit;
    }
    // jakiś inny warunek
    
    	$email = $_POST['email'];
    
    	if ( is_email( $email ) ) {
    		echo json_encode( array( 'status' => 'redirect', 'redirect' => true, 'message' => 'Zostałeś wtajemniczony.' ) );
    		exit;
    	} else {
    		throw new Exception( 'Error sending, Sprawdź AJAX.' );
    	}
    
    } catch ( Exception $e ) {
    	echo json_encode( array( 'status' => 'error', 'message' => $e->getMessage() ) );
    	exit;
    }
    wp_die();

    Dzięki, patrzyłem na to na prawdę długo i nie zauważyłem tej rozbieżności.
    To zawsze TRUE to było tylko do testu, a obsługę formularza będę miał bardziej skomplikowaną i w końcu zrezygnowałem z update_user_meta
    i będę zapisywał w bazie we własnych tabelach nie wordpressowych.

    Tak jeszcze dodam, jakby ktoś miał ten sam problem, jeśli dołącza się

    wp_enqueue_script('jquery');

    bez dodatkowych definicji, to trzeba użyć jQuery, bo $ nie zadziała.
    Dzięki i pozdrawiam
    Tomek

    • Ta odpowiedź została zmodyfikowana 2 weeks, 3 days temu przez cimek69.
Viewing 2 replies - 1 through 2 (of 2 total)