teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2020/01/13 09:21

投稿

退会済みユーザー
answer CHANGED
@@ -17,4 +17,104 @@
17
17
 
18
18
  ちなみにechoでも出力されたとのことですがショートコードはreturnしてください。
19
19
  [関数リファレンス/add shortcode](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_shortcode)
20
- > **注意**: ショートコードのコールバック関数は何も出力してはいけません。ショートコードを置き換えるために使われるテキストを返す必要があります。何か出力すると予期せぬ結果につながります。これはフィルター関数についても同様です。いつ、どこから呼び出されるかをあなたは制御できないので、呼び出されたときに副作用を引き起こしてはいけません。
20
+ > **注意**: ショートコードのコールバック関数は何も出力してはいけません。ショートコードを置き換えるために使われるテキストを返す必要があります。何か出力すると予期せぬ結果につながります。これはフィルター関数についても同様です。いつ、どこから呼び出されるかをあなたは制御できないので、呼び出されたときに副作用を引き起こしてはいけません。
21
+
22
+
23
+
24
+ **更に追記**
25
+ かなり適当ですが、私ならメタボックスを設けてしまいます。
26
+ ```
27
+ function extraction_test_func() {
28
+ #$html = $atts['html'];
29
+ #$start_leng = $atts['start'];
30
+ #$end_leng = $atts['end'];
31
+ $post_id = get_the_ID();
32
+ $html = get_post_meta( $post_id, 'html', true );
33
+ $start_leng = get_post_meta( $post_id, 'start', true );
34
+ $end_leng = get_post_meta( $post_id, 'end', true );
35
+
36
+ $ch = curl_init();
37
+ curl_setopt($ch, CURLOPT_URL, $html);
38
+ curl_setopt($ch, CURLOPT_HEADER, false);
39
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
40
+ curl_setopt($ch, CURLOPT_TIMEOUT, 60);
41
+ $json = curl_exec($ch);
42
+ curl_close($ch);
43
+ $result = json_decode($json, true);
44
+
45
+ $start = mb_strpos($json,$start_leng);
46
+ $end = mb_strpos($json,$end_leng);
47
+ $extraction = mb_substr($json, $start, $end-$start);
48
+
49
+ return $extraction;
50
+
51
+ }
52
+ add_shortcode( 'extraction_test', 'extraction_test_func' );
53
+
54
+ add_action( 'add_meta_boxes', function () {
55
+ add_meta_box(
56
+ 'custom_fields_meta_box',
57
+ 'Fields',
58
+ 'my_custom_fields_meta_box',
59
+ 'post',
60
+ 'normal',
61
+ 'high'
62
+ );
63
+ } );
64
+
65
+ function my_custom_fields_meta_box() {
66
+ global $post;
67
+ $html = get_post_meta( $post->ID, 'html', true );
68
+ $start = get_post_meta( $post->ID, 'start', true );
69
+ $end = get_post_meta( $post->ID, 'end', true );
70
+ ?>
71
+ <p>HTML: <input type="text" name="html" value="<?php echo $html; ?>" style="width:30%;"></p>
72
+ <p>START: <input type="text" name="start" value="<?php echo $start; ?>" style="width:30%;"></p>
73
+ <p>END: <input type="text" name="end" value="<?php echo $end; ?>" style="width:30%;"></p>
74
+ <?php
75
+ }
76
+
77
+ add_action( 'save_post', function( $post_id ) {
78
+ if ( isset( $_POST['html'] ) ) {
79
+ update_post_meta( $post_id, 'html', $_POST['html'] );
80
+ } else {
81
+ delete_post_meta( $post_id, 'html' );
82
+ }
83
+ if ( isset( $_POST['start'] ) ) {
84
+ update_post_meta( $post_id, 'start', $_POST['start'] );
85
+ } else {
86
+ delete_post_meta( $post_id, 'start' );
87
+ }
88
+ if ( isset( $_POST['end'] ) ) {
89
+ update_post_meta( $post_id, 'end', $_POST['end'] );
90
+ } else {
91
+ delete_post_meta( $post_id, 'end' );
92
+ }
93
+ } );
94
+ ```
95
+
96
+
97
+ **釈然としないようなので更に追記しおきます。**
98
+ 上手くいかないコードの`$atts`の中身はこのようになっています。
99
+ ```
100
+ Array
101
+ (
102
+ [html] => https://www.yahoo.co.jp/
103
+ [start] =>
104
+ [end] =>
105
+
106
+ <tbody>
107
+ <tr>
108
+ )
109
+
110
+ ```
111
+ これは`shortcode_parse_atts()`関数によって不正なHTMLタグが切り取られた結果で
112
+ [shortcode_parse_atts() | Function | WordPress Developer Resources](https://developer.wordpress.org/reference/functions/shortcode_parse_atts/)
113
+ **Reject any unclosed HTML elements.**と書かれおり、仕様なので仕方ありません。
114
+
115
+ 回避策は
116
+ 独自に`the_content`のフィルターフックを作成しその中で独自の`shortcode_parse_atts()`関数もどきを作成して不正なHTMLも通してしまう方法。
117
+ または
118
+ []内の`<`や`>`を`&lt;`や`&gt;`に変換して保存してショートコード実行時に元に戻す方法。
119
+
120
+ が考えられますが、カスタムフィールドを使用した方が操作性はいいでしょうね。

1

追記

2020/01/13 09:21

投稿

退会済みユーザー
answer CHANGED
@@ -1,1 +1,20 @@
1
- `echo $extraction;`ではなく`return $extraction;`でしょうね
1
+ `echo $extraction;`ではなく`return $extraction;`でしょうね
2
+
3
+ **追記**
4
+ ちゃんと読んでませんでした。
5
+
6
+ 修正すべき点は以下
7
+ ```
8
+ $html = $atts[html];
9
+ $start_leng = $atts[start];
10
+ $end_leng = $atts[end];
11
+
12
+ $html = $atts['html'];
13
+ $start_leng = $atts['start'];
14
+ $end_leng = $atts['end'];
15
+ ```
16
+ きちんと表示されるソースコードとの違いは変数だけみたいなので変数の中身が問題無いかvar_dumpで確認してください。
17
+
18
+ ちなみにechoでも出力されたとのことですがショートコードはreturnしてください。
19
+ [関数リファレンス/add shortcode](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_shortcode)
20
+ > **注意**: ショートコードのコールバック関数は何も出力してはいけません。ショートコードを置き換えるために使われるテキストを返す必要があります。何か出力すると予期せぬ結果につながります。これはフィルター関数についても同様です。いつ、どこから呼び出されるかをあなたは制御できないので、呼び出されたときに副作用を引き起こしてはいけません。