// ▼▼▼▼▼▼▼▼▼▼ 以下に子テーマ用の関数を書く ▼▼▼▼▼▼▼▼▼▼ // Astraテーマ投稿ページのPreviousリンクとNextリンクを削除する add_filter( 'astra_single_post_navigation_enabled', '__return_false' ); // [変更] セッションは不要になったため、my_start_session 関数と add_action は削除します。 // ▼▼▼ 安全装置:管理画面では、以下のコードを一切実行しない ▼▼▼ if ( ! is_admin() ) { // (中略) ... my_custom_display_dmm_product_info_in_content, _my_get_external_image_tag, // astra_get_post_thumbnail, post_thumbnail_html, my_custom_term_list_shortcode などの // 関数はそのまま残してください。 /** * -------------------------------------------------------------------------- * 3. 投稿ページ用のJavaScriptをまとめて読み込む (新設計版) * -------------------------------------------------------------------------- * 必要な情報をJavaScriptに渡し、スクリプトを読み込みます。 * PHPの役割は、APIの準備と、JSに初期情報(現在の投稿IDなど)を渡すことだけに絞ります。 */ function my_enqueue_single_post_scripts() { // 投稿ページでのみ、この機能を作動させる if ( is_single() && get_post_type() === 'post' ) { // スワイプナビゲーション用のJSを読み込む wp_enqueue_script( 'swipe-navigation', get_stylesheet_directory_uri() . '/js/swipe-nav.js', array(), // 依存関係なし CHILD_THEME_ASTRA_CHILD_VERSION, true // trueでの直前に読み込む ); // JavaScriptに渡すデータを設定 wp_localize_script( 'swipe-navigation', 'swipeNavData', array( 'currentPostId' => get_the_ID(), // 現在の投稿ID 'restUrl' => rest_url( 'mynamespace/v1/next_post' ), // 後で作成するREST APIのエンドポイントURL 'nonce' => wp_create_nonce( 'wp_rest' ), // セキュリティのためのnonce 'homeUrl' => home_url('/'), // 関連記事がない場合の遷移先 ) ); // カスタム動画プレイヤー用のスクリプト wp_enqueue_script( 'custom-video-player', get_stylesheet_directory_uri() . '/js/custom-video-player.js', array(), CHILD_THEME_ASTRA_CHILD_VERSION, true ); } } add_action( 'wp_enqueue_scripts', 'my_enqueue_single_post_scripts' ); /** * -------------------------------------------------------------------------- * 4. 「次へ」の記事を取得するためのカスタムREST APIエンドポイントを作成 * -------------------------------------------------------------------------- * JavaScriptからのリクエストに応じて、次の関連記事のURLを返します。 * URL: /wp-json/mynamespace/v1/next_post */ function my_register_rest_routes() { register_rest_route( 'mynamespace/v1', '/next_post', array( 'methods' => 'POST', // POSTメソッドでデータを受け取る 'callback' => 'my_get_next_post_endpoint', 'permission_callback' => '__return_true', // 誰でもアクセス可能(必要に応じて権限設定を強化) ) ); } add_action( 'rest_api_init', 'my_register_rest_routes' ); /** * REST APIエンドポイントの処理内容 * @param WP_REST_Request $request * @return WP_REST_Response */ function my_get_next_post_endpoint( WP_REST_Request $request ) { // JSから送られてきたJSONデータを取得 $current_post_id = $request->get_param('currentPostId'); $viewed_post_ids = $request->get_param('viewedPostIds'); // パラメータが不正な場合はエラーを返す if ( empty( $current_post_id ) || ! is_array( $viewed_post_ids ) ) { return new WP_Error( 'bad_request', 'Invalid parameters', array( 'status' => 400 ) ); } // YARPPが有効かチェック if ( ! function_exists( 'yarpp_get_related' ) ) { return new WP_Error( 'yarpp_not_found', 'YARPP is not active', array( 'status' => 500 ) ); } $related_posts = yarpp_get_related( array( 'post_type' => array( 'post' ), 'limit' => 5, // 念のため複数取得 'post__not_in' => $viewed_post_ids, // [最重要] JSから受け取った閲覧済みの記事を全て除外 ), $current_post_id ); if ( ! empty( $related_posts ) ) { $next_post = $related_posts[0]; // 最初の記事を次の記事とする $next_url = get_permalink( $next_post->ID ); return new WP_REST_Response( array( 'success' => true, 'nextUrl' => $next_url ), 200 ); } else { // 関連記事が見つからなかった場合 return new WP_REST_Response( array( 'success' => false, 'message' => 'No related posts found.' ), 200 ); } } } // ▲▲▲ 安全装置を閉じる ▲▲▲