質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1814閲覧

wordpressでのfunctions.phpからJquery(ajax)への変数渡し方法について

teltelboy

総合スコア16

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/06/09 04:19

編集2019/06/09 04:21

まだ経験が浅く、初歩的なご質問かもしれませんが、恐れ入りますが、
解決方法がわかるようでしたら、ご教示頂けますと助かります

前提・実現したいこと

・wordpress、PHP、JQuery(ajax)、MYSQLを使って検索サイトを構築しています。
・URLのGETパラメータから取得した変数をJQuery(ajax)へ渡したいのですが、
渡せずにNULLとなっている状況です。
・wordpressでのfunctions.phpからJquery(ajax)への変数渡しを行いたい。

発生している問題・エラーメッセージ

【処理の流れ】
①.A画面表示時にURLのGETパラメータから変数取得
変数:lastnanme、firstname
関数:functions.php(cc_get_firstname_handler、cc_get_lastname_handler)

②.取得した変数をJQuery(ajax)へを渡す。
関数:functions.php(add_files)
引き渡し先:/js/ajax_table.js

③ajax_table.jsで取得確認

上記③において、IEのコンソールログを確認した結果、
lastnm、firstnmがNULLとなっています。★箇所です。
ここに変数をセットする方法がわからなくて困っています。

疑っている点として、「functions.php(cc_get_firstname_handler、cc_get_lastname_handler)」より先に「functions.php(add_files)」が実行されることにより、変数が取得できていない可能性があると思っています。

該当のソースコード

php

1//functions.php 2 3//クエリ変数登録 4function add_meta_query_vars( $public_query_vars ) { 5 $public_query_vars[] = 'lastname'; 6 $public_query_vars[] = 'firstname'; 7 return $public_query_vars; 8} 9add_filter( 'query_vars', 'add_meta_query_vars' ); 10 11//lastname取得 12function cc_get_lastname_handler() { 13global $g_lastname; 14 $g_lastname = htmlspecialchars(get_query_var( 'lastname', 'default' )); 15 return $g_lastname; 16} 17add_shortcode("cc_get_lastname", "cc_get_lastname_handler"); 18 19//firstname取得 20function cc_get_firstname_handler() { 21global $g_firstname; 22 $g_firstname = htmlspecialchars(get_query_var( 'firstname', 'default' )); 23 return $g_firstname; 24} 25add_shortcode("cc_get_firstname", "cc_get_firstname_handler"); 26 27// Jquery(ajax_table.js)読み込み、g_lastname、g_firstname変数をJQuery渡し(うまく渡せてない) 28function add_files() { 29global $g_lastname; 30global $g_firstname; 31 32$ex_array = array( 33 'lastnm' => $g_lastname, 34 'firstnm' => $g_firstname 35); 36 37//var_dump($g_lastname); 38//var_dump($g_firstname); 39 40 // WordPress本体のjquery.jsを読み込まない 41 wp_deregister_script('jquery'); 42 wp_enqueue_style('bootstrap', 'https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.css',array(),false, false); 43 wp_enqueue_style('bootstrap4', 'https://cdn.datatables.net/1.10.18/css/dataTables.bootstrap4.min.css',array(),false, false ); 44 45 wp_enqueue_script( 'jquery1', 'https://code.jquery.com/jquery-3.3.1.js',array(),false, true ); 46 wp_enqueue_script( 'jquery2', 'https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js',array('jquery1'),false, true ); 47 wp_enqueue_script( 'jquery3', 'https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap4.min.js',array('jquery2'), false, true ); 48 wp_enqueue_script( 'script1', get_stylesheet_directory_uri() . '/js/ajax_table.js', array( 'jquery3' ),false, true ); 49 wp_localize_script( 'script1', 'my_script_vars',$ex_array); 50} 51 add_action( 'wp_enqueue_scripts', 'add_files',100 ); 52 53//ajaxから呼び出す関数 54function get_record(){ 55 56global $wpdb; 57//SQLは省略してます。 58 $sql = "SELECT 59 lastname, 60 firstname 61 from test"; 62 63var_dump($g_lastname); 64var_dump($g_firstname); 65var_dump($sql); 66 67$result = array(); 68$result = $wpdb->get_results($sql,ARRAY_A); 69echo json_encode(['data'=>$result],JSON_UNESCAPED_UNICODE); 70var_dump($result); 71die(); 72} 73 74add_action( 'wp_ajax_get_record', 'get_record'); 75add_action( 'wp_ajax_nopriv_get_record', 'get_record'); 76} 77

JS

1console.log('コンソール出力確認'); 2//★ここで変数がNULLとなっていることを確認。 3console.log(my_script_vars); 4 5 6//画面表示に読み込まれる 7$(document).ready(function() { 8 $.extend( $.fn.dataTable.defaults, { 9 language: { 10 url: "https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Japanese.json" 11 } 12 }); 13 $('#testtest').dataTable ({ 14 lengthMenu: [ 100, 200, 300, 400, 500 ], 15 // 件数のデフォルトの値を50にする 16 displayLength: 200, 17 dom: 18 "<'row'<'col-sm-8 col-md-4'i><'col-sm-8 col-md-4'f>>" + 19 "<'row'<'col-sm-12'tr>>" + 20 "<'row'<'col-sm-10 col-md-6'p>>", 21// dom: '<"top"fil>rt<"bottom"p><"clear">', 22 order: [ [ 1, "desc" ],[ 4, "asc" ] ], 23 "ajax" : { 24 "url": ajaxurl, 25 "data" :{ 26 "action" : 'get_record', 27 }, 28 "datatype": "json" //受け取りデータの種類 29// "dataSrc": "" 30 }, 31 "columnDefs":[ 32 {targets:0,title:'苗字',data:'lastname'}, 33 {targets:1,title:'名前',data:'firstname'}, 34 ] 35 36}); 37 38});

試したこと

console.logでどこまで進んでいるかを確認しましたが、★部分でつまづいています。

補足情報(FW/ツールのバージョンなど)

・WordPress 5.2
・PHP 7.2.x

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YukiYamashina

2019/06/09 12:05 編集

ウェブページのソースコードの head 要素内に /* <![CDATA[ */ var my_script_vars = {...}; /* ]]> */ は吐き出されていますでしょうか?
teltelboy

2019/06/09 14:33

コメントありがとうございます。 IE(開発者ツール)のResponseから以下の通り、nullとなっていることを確認しました。 /* <![CDATA[ */ var my_script_vars = "{\"lastnm\":null,\"firstnm\":null}"; /* ]]> */ また、上記内容はheaderではなく、body要素には吐き出させている状況です。 head要素に吐き出されない時点で見直し等必要でしょうか。
guest

回答1

0

ベストアンサー

現在のコードでは $g_lastname / $g_firstname 変数に値を代入するタイミングが

add_shortcode("cc_get_lastname", "cc_get_lastname_handler"); add_shortcode("cc_get_firstname", "cc_get_firstname_handler");

で、その変数を $ex_array に代入するのが

add_action( 'wp_enqueue_scripts', 'add_files',100 );

になっています。

ですが、WordPress ではwp_enqueue_scripts にフックした関数の方が先に実行されます。
wp_enqueue_scripts にフックした関数は wp_headadd_shortcode で登録した関数は do_shortcode もしくは the_content 関数実行時に呼ばれます。)

ですので、get_query_var 関数でのクエリ変数の取得を add_files で行ってみてはいかがでしょうか?

php

1<?php 2function cc_get_lastname_handler() { 3 global $g_lastname; 4 return $g_lastname; 5} 6 7function cc_get_firstname_handler() { 8 global $g_firstname; 9 return $g_firstname; 10} 11 12function add_files() { 13 global $g_lastname; 14 global $g_firstname; 15 16 $g_lastname = htmlspecialchars(get_query_var( 'lastname', 'default' )); 17 $g_firstname = htmlspecialchars(get_query_var( 'firstname', 'default' )); 18 19 $ex_array = array( 20 'lastnm' => $g_lastname, 21 'firstnm' => $g_firstname 22 ); 23 24 // 以下省略 25}

投稿2019/06/09 15:03

YukiYamashina

総合スコア1011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teltelboy

2019/06/10 01:31

ご回答ありがとうございました。 ご回答の通り、add_filesに入れることで変数を取得することが出来ました。 また、原因となっていた実行順序も今後は意識してコードするようにしていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問