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

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

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

Facebook Graph APIとは Facebookのグラフデータベース用のAPIであり、対応言語はPHP、Perl、ActionScript、JavaScriptなどがあります。

WordPress

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

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

Q&A

解決済

1回答

2418閲覧

facebookの予約投稿の作成で、WPの「予約投稿」ステータスの記事のOGP情報を取得させたい

stadmlmg

総合スコア12

Facebook Graph API

Facebook Graph APIとは Facebookのグラフデータベース用のAPIであり、対応言語はPHP、Perl、ActionScript、JavaScriptなどがあります。

WordPress

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

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

0グッド

0クリップ

投稿2018/10/30 10:08

お世話になります。
知識がなくて大変恐縮なのですが、どなたかお力添えいて抱けると幸いです。

実現したいこと

facebookの予約投稿の作成で、WPの「予約投稿」ステータスの記事のOGP情報を取得させたい。

概要

通常WPの予約投稿記事は閲覧権限があるユーザーとしてログインしていないと404となってしまいますが、facebookのクローラに対しては通常通り記事を閲覧させ、OGPタグ情報を取得させたいです。

これを実現するため、

facebook用のアカウント「facebook_ua」を権限グループ「編集者」で用意し、facebookのクローラから予約投稿の記事にアクセスがあった際は「facebook_ua」としてログインさせ、記事を公開する。

という方法を考えてみました。

facebookのクローラはユーザーエージェントに「facebookexternalhit」を含んでいるようです。
https://developers.facebook.com/docs/sharing/webmasters/crawler?locale=ja_JP

従って、

「予約投稿」ステータスの記事にアクセスがあった際は、facebookクローラからのスクレイピングを判別し、「facebook_ua」としてログインさせ、リクエストのあった同じページにリダイレクト処理を行えば「facebook_ua」の権限グループ「編集者」としてアクセスできるので正常に記事が見れる。

と予測し、parse_queryのフィルターに下記コードでフックしてみました。

※すみません。色々突っ込みどころの有るコードでお恥ずかしいのですが。。。

PHP

1function facebookCrawler($query){ 2 3 if( !is_single() ) return false; 4 if( is_user_logged_in() ) return false; 5 6 $query_p = $query->query['p']; 7 $access_ua = $_SERVER['HTTP_USER_AGENT']; 8 $fb_ua = 'facebookexternalhit'; 9 10 if( get_post_status($query_p) != 'future' ) return false; 11 if( strpos($access_ua, $fb_ua) === false ) return false; 12 13 $login_info = array( 14 'user_login' => 'facebook_ua', 15 'user_password' => 'password', 16 'remember' => false 17 ); 18 19 $user_info = wp_signon($login_info, false); 20 21 if( is_wp_error($user_info) ) { 22 wp_redirect( home url() ); 23 exit; 24 } 25 26 wp_redirect( get_the_permalink($query_p).'/'); 27 exit; 28} 29 30add_filter('parse_query','facebookCrawler');

上記コードをfunctions.phpに記述したうえで、
chromeでユーザーエージェントを「facebookexternalhit」に偽装しアクセスしたところ、

ブラウザでの挙動は狙ったとおりになりました。ですが、facebookのobjectデバッガー(https://developers.facebook.com/tools/debug/og/object/)での結果は、

「入力URLのパース中にエラーが発生しました。キャッシュまたはスクレイピングされたデータはありません。」

と表示されてしまい、正常に読み込めませんでした。

この結果に対しての予測として、

クローラはクッキー情報を保持できない。従って、一度ログイン処理させてもリダイレクトが発生した時点でクッキー情報を失ってしまい、アクセスに失敗した。

と考えたのですが、デバッガの結果を見るとステータスコードが404ではなく、302だったのでイマイチピンと来ていません。

ユーザーエージェントを偽装すれば予約投稿記事が見れてしまうという欠点は承知の上です。

①ブラウザの挙動と同じ通りに行かないのは予想した通り、クローラがクッキー情報を持てないからなのか
②そもそもfacebookにWPの予約投稿ステータスの予約投稿する方法は存在するのかの2点をご教示いただけるとありがたいです。

知見がある方、何卒お力添えのほど、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

pre_get_postsフック時にUAを確認してfacebookならwp_signonして、リダイレクトしなければどうでしょう。
もしくは、'post_status'array( 'publish', 'draft', 'future', 'private' ) とかを pre_get_postsフックで書き換えるとか。

【関数リファレンス/WP Query - WordPress Codex 日本語版】
https://wpdocs.osdn.jp/関数リファレンス/WP_Query#ステータスのパラメータ

投稿2018/10/30 16:58

kei344

総合スコア69407

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

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

stadmlmg

2018/10/31 10:04

ご回答ありがとうございます。 「pre_get_postsフック時にUAを確認してログインさせ、リダイレクトはしない」 コチラの方法を試してみたところ、 ブラウザではリダイレクトせずに記事の内容を表示することはできました。 しかし、デバッガで確認してみると、「入力URLのパース中にエラーが発生しました。キャッシュまたはスクレイピングされたデータはありません。」 の表示となってしまいました。 「'post_status'に array( 'publish', 'draft', 'future', 'private' ) とかを pre_get_postsフックで書き換える」 コチラの方法を試させていただきましたところ、デバッガでは「Could Not Follow Redirect Path」などが表示されてしまい、うまく取得できなかったものの、実際のFacebookの予約投稿ではOGPタグを取得することが出来ました! ※実際には「publish」と「future」のステータスだけ取得出来れば今回の要件は満たせましたので、コードはそのようにさせて頂いております。 尚、facebookにて既に生成済みの予約投稿から「シェアした添付ファイルを更新」で画像、リンク、descriptionを取得できました。 (新規作成ではまだ試していません) コチラの方法でしたら、編集者の権限を持つfacebook_uaのユーザーを作成しなくて済みますし、 ユーザーエージェント偽装されてもせいぜい予約投稿が閲覧されてしまうくらいなので、非常にベストな方法をご教示いただきました。 本当にありがとうございました。 ※なお、蛇足かもしれませんが参考になればと思い以下記述しておきます。 今回サーバーはz.comを使用していたのですが、z.com独自のキャッシュ方式により、ユーザーエージェントを偽装すると、ユーザーエージェントの情報をサーバーがキャッシュとして保持してしまい、以降のアクセスは保存されたユーザーエージェントでのアクセスとみなされるようです。 (なぜこのようになっているのかは分かりませんが...) 一般的なブラウザのユーザーエージェントはキャッシュするようなことはなく、都度アクセスしているもの認識する様です。 コントロールパネルよりz.comのキャッシュ機能を切ることによりこの現象を回避できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問