code

Wordpress + Vue.js : 연락처 양식

starcafe 2023. 10. 5. 23:25
반응형

Wordpress + Vue.js : 연락처 양식

저는 Vue.js를 사용하여 WP 테마를 작업하고 있으며, REST API를 통해 모든 데이터를 가져올 수 있습니다. 지금까지 데이터를 표시하는 면에서 모든 것이 완벽하게 작동합니다.

연락처 양식 플러그인(연락처 양식 7 -- 그러나 제안에 열려 있음)을 구현하려고 합니다.이 플러그인은 PHP에 숏코드를 추가하여 작동하지만, PHP를 사용하는 것이 아니라 클라이언트 측의 모든 프론트엔드를 렌더링하기 때문에 이 둘 사이의 통합을 달성하는 방법에 대해 혼란스럽습니다.

아이디어들 (나의 초기 접근방식은...)

1. 숨김

제 index.php 파일에 shortcode를 포함할 수 있는데 가시성을 숨기고 사용자가 연락처 페이지에 도달하면 javascript를 통해 상호 작용할 수 있습니다.양식을 입력할 필요가 없고 연락처 페이지에서만 로드할 수 있기 때문에 이 방법에 대해 잘 모르겠습니다.

2. 클라이언트 -> 서버

프론트엔드에서 양식을 작성하고 사용자 데이터를 수집하여 서버측 기능(functions.php)으로 전송합니다.그러면 이 데이터는 서버가 원하는 제출을 수행하는 데 사용됩니다.이게 말이 됩니까? / 그게 가능하긴 합니까?

그래서...

저는 그냥 방향을 찾고 있을 뿐입니다.Wordpress와 Vue를 따로따로 작업하는 것은 꽤 편하지만, 이런 맥락에서 클라이언트 측과 서버 측의 상호 작용에 관해서는 여전히 의문점이 있습니다.

앞으로 나아가는 데 도움이 될 만한 제안이 있습니까?많은 사이트에서 연락처 양식 7 플러그인을 사용하고 있기 때문에 저는 연락처 양식 7 플러그인을 사용하는 것을 선호합니다. 하지만 저는 또한 타사 서비스가 아닌 워드프레스 내에서 이상적으로 관리되는 다른 솔루션에도 열려 있습니다.어떤 의견이나 제안이든 감사히 받겠습니다!

감사합니다!

이것이 해결책이 될 수도 있겠지만, 아마도 가장 우아하지는 않을 것입니다.

참고로 loadPageInformation은 REST API를 호출할 때 사용한 방법으로, 다음과 같이 pageInfo에 응답이 저장됩니다.

loadPageInformation: function(slug) {

  this.pageInfo = null;

  // retrieving page data using the page slug.
  axios.get(this.appData.rest_url + '/wp/v2/pages?slug=' + slug)
  .then( response => { this.pageInfo = response.data[0]; } )
  .catch( error => { console.log( error ); } );

},

템플릿 파일에서:

<template>

    <div class="v-page" v-if="this.$root.pageInfo != null">

        <b-row class="">

            <b-col cols="12">

                <h1>{{ this.$root.pageInfo.title.rendered }}</h1>

                <div class="contact-form"></div>

            </b-col>

        </b-row>

     <!-- footer. -->

     <footer-component></footer-component>

   </div>

</template>

<script> 

export default {

    created: function() {

        this.$root.loadPageInformation(this.$route.params.pageSlug);

    },

    updated: function() {

        $( ".cform7 .wpcf7" ).appendTo( ".contact-form" );

    }
}

</script>

기본적으로 PHP에서 폼을 잘라 템플릿 파일에 붙여넣는 업데이트된 메서드 아래에서 jQuery 라인을 확인할 수 있습니다.그 선이 바로 제안된 해결책입니다.양식은 PHP에서 do_shortcode와 함께 호출됩니다.

 <div class="cform7 d-none">

    <?php echo do_shortcode('[contact-form-7 id="104" title="Contact form"]'); ?> 

 </div>

EDIT: 다른 솔루션

이전 솔루션을 테스트해 본 결과 몇 가지 문제점이 발견되었습니다.여기 새로운 접근법이 있습니다.

단답: 새 Custom Post Type을 만들어 쇼트코드를 인쇄한 다음 생성된 URL을 Vue 구성 요소에 로드합니다.

매우 긴 답변:

참고: Vue에서 생성된 JS 및 CSS 파일을 함수에서 로드합니다.php가 올바른 프로세스여야 합니다.그것은 다음 단계에서 유용할 것입니다.

그래서 쇼트코드라는 사용자 지정 게시물 유형을 만들었습니다.

 function custom_shortcodes_post() {
    $labels = array(
      'name'               => __( 'Shortcodes' ),
      'singular_name'      => __( 'Shortcode' ),
      'add_new'            => __( 'Add new shortcode' ),
      'add_new_item'       => __( 'Add new shortcode' ),
      'edit_item'          => __( 'Edit shortcode' ),
      'new_item'           => __( 'New shortcode' ),
      'all_items'          => __( 'All shortcodes' ),
      'view_item'          => __( 'See shortcode' ),
      'search_items'       => __( 'Search shortcodes' ),
      'not_found'          => __( 'No shortcodes found' ),
      'not_found_in_trash' => __( 'No shortcodes in trash' ),
      'parent_item_colon'  => '',
      'menu_name'          => 'Shortcodes'
    );
    $args = array(
      'labels'              => $labels,
      'description'         => 'Save shortcodes with specific data',
      'public'              => true,
      'show_in_rest'        => true,
      'publicly_queryable'  => true,
      'show_ui'             => true,
      'show_in_menu'        => true,
      'query_var'           => true,
      'rewrite'             => array( 'slug' => 'shortcodes' ),
      'capability_type'     => 'post',
      'has_archive'         => false,
      'hierarchical'        => false,
      'menu_position'       => 6,
      'supports'            => array( 'title', 'editor' )
    );
    register_post_type( 'shortcodes', $args );
  }
  add_action( 'init', 'custom_shortcodes_post' );

그리고 새로운 숏코드 게시물을 만들었고, 그 내용에는 연락처 양식 7이 주는 숏코드를 적었습니다.저는 싱글 쇼트 코드도 만들었습니다.php, 다음과 같습니다.

<!DOCTYPE html>

   <html <?php language_attributes(); ?>>

       <head>

           <?php wp_head(); ?>

       </head>

       <body style="background:none">

            <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

                 <?php the_content(); ?>

            <?php endwhile; endif; ?>

            <?php wp_footer(); ?>

       </body>

</html>

마지막으로 템플릿 파일은 동일하지만 다른 JS 내용으로 유지됩니다.

<template>

  <div class="v-page" v-if="this.$root.pageInfo != null">

    <b-row class="">

        <b-col cols="12">

            <h1>{{ this.$root.pageInfo.title.rendered }}</h1>

            <div class="contact-form"></div>

        </b-col>

    </b-row>

     <!-- footer. -->

    <footer-component></footer-component>

  </div>

</template>

<script> 

  export default {

    created: function() {

        this.$root.loadPageInformation(this.$route.params.pageSlug);

    },

    updated: function() {

        if (this.$route.params.pageSlug == 'contact') {

            $( '.contact-form' ).load( '/shortcodes/contact-form/' );

        }
    }
 }

</script>

그 후 콘솔에 오류가 나타납니다. 싱글 쇼트 코드가 발생하기 때문입니다.php는 Vue에서 JS와 CSS 파일을 로드하고 있어 기능상으로도 그렇습니다.php 내가 약간 수정했습니다.

 if ( !is_singular( 'shortcodes' ) ) {

     // here I load the JS and CSS files from Vue.

 }

CSS와 JS 파일을 등록하는 전체 코드는 다음과 같습니다.

 function rci_theme_enqueue() {

    if ( !is_singular( 'shortcodes' ) ) {

        // enqueue main style.
        wp_enqueue_style( 
            'app', 
            get_template_directory_uri() . '/spa/dist/css/app.css' 
        );

        // register the script.
        wp_register_script( 
            'vue_app', 
            get_template_directory_uri() . '/spa/dist/app.js',
            array(), 
            '1.0.0', 
            true 
        );

        // localize the script with new data.
        global $post;
        $app_data = array(
            'rest_url' => untrailingslashit( esc_url_raw( rest_url() ) ),
            'theme_url' => get_template_directory_uri(),
            'app_path' => $post->post_name, // page where the custom page template is loaded.
        );

        wp_localize_script( 'vue_app', 'app_data', $app_data );

        // enqueued script with localized data.
        wp_enqueue_script( 'vue_app' );
    }
}
add_action( 'wp_enqueue_scripts', 'rci_theme_enqueue' );

다시 말하지만, 제가 보기에 그것은 우아한 해결책처럼 들리지 않지만, 불행하게도 Vue와 WordPress를 섞을 때, 여러분은 WordPress의 핵심 기능을 잃게 될 것입니다.

누군가에게 도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/44954565/wordpress-vue-js-contact-forms

반응형