回答編集履歴
2
追記
    
        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 | 
            +
            []内の`<`や`>`を`<`や`>`に変換して保存してショートコード実行時に元に戻す方法。
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            が考えられますが、カスタムフィールドを使用した方が操作性はいいでしょうね。
         | 
1
追記
    
        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 | 
            +
            > **注意**: ショートコードのコールバック関数は何も出力してはいけません。ショートコードを置き換えるために使われるテキストを返す必要があります。何か出力すると予期せぬ結果につながります。これはフィルター関数についても同様です。いつ、どこから呼び出されるかをあなたは制御できないので、呼び出されたときに副作用を引き起こしてはいけません。
         | 
