버튼 클릭으로 functions.php에서 메소드 호출

나는 메소드를 호출해야하는 프로젝트에서 작업하고 있습니다 (사용자를 받아들이는 ID를 입력으로) 제출 버튼 (수락 버튼)을 클릭합니다.

모든 방법을 시도했지만 제가 직면 한 진짜 과제는 프런트 엔드에서 사용자 ID를 얻는 방법이고 메소드에 전달합니다.

내 메소드는 특정 사용자의 사용자 메타를 업데이트합니다.

Html 코드 :

<div> <div class="modalconent"> <h3 align=center>GDPR</h3> <p>This is a GDPR Pop Up</p><br><br><br> <form> <input name="accept" type="checkbox" value="Gdpr" required/>I accept the GDPR <input type="submit" value="Accept"> </form> </div> </div> <script> window.onload = function () { document.getElementById("accept-button").onclick = function () { document.getElementById("modal").style.display = "none" }; }; </script> 

현재 클릭했을 때의 수락 버튼은 아무 것도 표시하지 않습니다. display : none;

내 PHP 코드 :

function updateHasReadFlag($user) { // I added support for using this function either with user ID or user object if ( $user && is_int( $user ) ) { $user_id = $user; } else if ( ! empty( $user->ID ) ) { $user_id = $user->ID; } else { return; } return update_user_meta( $user_id, "META_KEY", true ); } 

생성 된 양식 코드 :

<form method="post" action="<?php echo esc_url( home_url() ); ?>"> <input name="accept" type="checkbox" value="Gdpr" required=""> I accept the GDPR <input type="submit" value="Accept"> <!--?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?--> </form> 

넌스 필드가 주석 처리 된 이유를 이해할 수 없습니다. 코드가 생성 된 것과 정확히 일치하며 코드에서 아무 것도 편집하지 않았습니다.

설명

  • 다시로드하지 않고 메타 데이터를 업데이트하려고합니까? 현재 페이지? 양식을 동일한 페이지에 제출하고 페이지로드시 메타 데이터를 업데이트하는 것은 어떻습니까?
  • 예 메타 데이터를 업데이트하려고합니다. 당신이 말하는 것에 대한 해결책을 제공 할 수 있습니까? 아주 좋을 것입니다.

답변

현재를 다시로드하지 않으려면 AJAX를 사용할 수 있습니다. — 페이지 즉, “수락”버튼을 클릭하면 현재 페이지를 벗어나지 않고 AJAX 요청을 통해 사용자 메타 데이터를 업데이트합니다.

그러나 해결책은 제가 제안하는 것은 AJAX를 사용하지 않습니다 . 대신 홈페이지에 양식 (action 속성 값 설정)을 제출 한 다음 template_redirect 후크를 사용하여 메타 데이터를 업데이트합니다. (이전 또는 참조 페이지로 다시 리디렉션)

단계

  1. form 태그를 :

    <form method="post" action="<?php echo esc_url( home_url() ); ?>"> 

    다음 nonce 필드를 추가합니다.

    <?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?> 

    이제 form는 다음과 같습니다.

    <form method="post" action="<?php echo esc_url( home_url() ); ?>"> <input name="accept" type="checkbox" value="Gdpr" required /> I accept the GDPR <input type="submit" value="Accept" /> <?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?> </form> 
  2. 테마 functions.php 파일에 추가 :

    function accept_gdpr() { // Check if the user is authenticated. if ( ! is_user_logged_in() ) { return; } // Check if we have all necessary data. if ( empty( $_POST["accept_gdpr_nonce"] ) || empty( $_POST["accept"] ) || "Gdpr" !== $_POST["accept"] ) { return; } // Verify the nonce. if ( ! wp_verify_nonce( $_POST["accept_gdpr_nonce"], "accept-gdpr" ) ) { return; } // Update the meta. update_user_meta( get_current_user_id(), "META_KEY", "1" ); // Redirect back to the previous page. wp_safe_redirect( wp_get_referer() ); exit; } add_action( "template_redirect", "accept_gdpr" ); 

    참고 :

    1. Gdpr"Gdpr" !== $_POST["accept"]는 위의 <input name="accept" type="checkbox" value="Gdpr" required />와 동일합니다.

    2. 반드시 교체해야합니다. 실제 메타 키가있는 META_KEY

    3. GDPR 승인이 로그를 목표로한다고 생각합니다. ged-in 사용자 만 해당되므로 위 코드 / 함수에서 is_user_logged_in()get_current_user_id()를 사용한 이유입니다.

UPDATE

wp_safe_redirect()가 OP에서 작동하지 않았으므로 wp_redirect().

답변

wp_localize_script () 도 여기 에서 사용할 수 있습니다.
짧은 이야기 : WordPress에서

in JS
따라서 다음과 같은 작업을 수행 할 수 있습니다.
FIRST style.css와 같은 수준의 테마 루트에 js 폴더를 만듭니다 (없는 경우). 그러나이 js 폴더에 call-php.js 파일을 만듭니다. 원하는대로 이름을 지정할 수 있습니다. 중요한 것은 .js 파일
에 있어야한다는 것입니다. functions.php function updateHasReadFlag($user) 추가 :

/** * Hooking in JS code. */ function call_php_in_js() { wp_enqueue_script( "call-php-in-js", get_template_directory_uri() . "/js/call-php.js", array( "jquery" ), filemtime( get_theme_file_path( "/js/call-php.js" ) ), true ); $php_to_js = array( "my_php_function" => updateHasReadFlag( $user ), ); wp_localize_script( "call-php-in-js", "object_name", $php_to_js ); } add_action( "wp_enqueue_scripts", "call_php_in_js" ); 

SECOND , call-php.js 파일에 다음을 추가하십시오.

( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery ); 

이 방법으로 문제가 해결되기를 바랍니다.
제가하지 않았습니다. ” 테스트 해보지 만 제대로 작동합니다.
테스트 한 후 알려주세요.

댓글

  • 답변 해 주셔서 감사합니다. .하지만 어떻게 든 작동하지 않습니다. 내 function updateHasReadFlag($user)가 호출되지 않습니다. 또는 호출되고 있지만 update_user_meta( $user_id, 'META_KEY', true );가 어떻게 든 작동합니다. 살펴볼 수 있습니까? 또한 HTML 코드에서 <script> </script>를 제거했습니다.
  • 질문 그냥 확인하기 위해 m, My function updateHasReadFlag($user)는 사용자 ID 또는 사용자 개체를 매개 변수로 허용하므로 특정 사용자 메타 데이터를 업데이트 할 수 있습니다. function updateHasReadFlag($user)
  • 를 호출 할 때 이것을 매개 변수로 전송하고 있습니까?

  • object_name.my_php_function;console.log(object_name.my_php_function); 콘솔에 표시되는 내용을 알려주세요.참고로, 내 답변을 사용하여 #accept-button를 클릭하면 #modal가 숨겨 지나요?
  • 기록됩니다. call-php.js의 콘솔에서 " null "
  • #modal 내 답변을 사용하여 #accept-button를 클릭하면 숨겨 지나요?

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다