PHPの話」カテゴリーアーカイブ

WordPressの掲示板bbpressをアレンジしてみた

WordPressの掲示板bbpressは、そのままだと気になる部分があるのでアレンジしてみました。
Wordpressの掲示板bbpressは、PPHで作られているのですが、PPHについては基本的な知識しか無いので苦労しました。

投稿時にurlを入力するのを削除したいのでpluginsの中の
bbpress・・・templates・・・default・・・bbpress・・・form-anonymous.php
を変更しました。

<p>
<label for=”bbp_anonymous_website”><?php esc_html_e( ‘Website:’, ‘bbpress’ ); ?></label><br />
<input type=”text” id=”bbp_anonymous_website” value=”<?php bbp_author_url(); ?>” size=”40″ maxlength=”200″ name=”bbp_anonymous_website” />
</p>

の部分を削除しました。

トピック一覧からトピック作成者の表示を削除することにしました。
pluginsの中の
templates・・・default・・・bbpress・・・loop-single-topic.php
を変更しました。

<?php do_action( ‘bbp_theme_before_topic_started_by’ ); ?>

<span class=”bbp-topic-started-by”><?php printf( __( ‘Started by: %1$s’, ‘bbpress’ ), bbp_get_topic_author_link( array( ‘size’ => ’14’ ) ) ); ?></span>

<?php do_action( ‘bbp_theme_after_topic_started_by’ ); ?>

の部分と

<p class=”bbp-topic-meta”>

<?php do_action( ‘bbp_theme_before_topic_freshness_author’ ); ?>

<span class=”bbp-topic-freshness-author”><?php bbp_author_link( array( ‘post_id’ => bbp_get_topic_last_active_id(), ‘size’ => 14 ) ); ?></span>

<?php do_action( ‘bbp_theme_after_topic_freshness_author’ ); ?>

</p>

の部分を削除しました。

「このフォーラムには1件のトピックが含まれ、2 時間、 40 分前に 俊 さんが最後の更新を行いました。」というのも削除する事にしました。

pluginsの中の
includes・・・forums・・・template.php
の2150行付近にある

// Forum has active data
if ( !empty( $last_active ) ) {

if ( !empty( $reply_count ) ) {

if ( bbp_is_forum_category( $forum_id ) ) {
$retstr = sprintf( esc_html__( ‘This category contains %1$s and %2$s, and was last updated by %3$s %4$s.‘, ‘bbpress’ ), $topic_text, $reply_text, $last_updated_by, $time_since );
} else {
$retstr = sprintf( esc_html__( ‘This forum contains %1$s and %2$s, and was last updated by %3$s %4$s.‘, ‘bbpress’ ), $topic_text, $reply_text, $last_updated_by, $time_since );
}

} else {

if ( bbp_is_forum_category( $forum_id ) ) {
$retstr = sprintf( esc_html__( ‘This category contains %1$s, and was last updated by %2$s %3$s.‘, ‘bbpress’ ), $topic_text, $last_updated_by, $time_since );
} else {
$retstr = sprintf( esc_html__( ‘This forum contains %1$s, and was last updated by %2$s %3$s.’, ‘bbpress‘ ), $topic_text, $last_updated_by, $time_since );
}
}

// Forum has no last active data
} else {

if ( !empty( $reply_count ) ) {

if ( bbp_is_forum_category( $forum_id ) ) {
$retstr = sprintf( esc_html__( ‘This category contains %1$s and %2$s.’, ‘bbpress’ ), $topic_text, $reply_text );
} else {
$retstr = sprintf( esc_html__( ‘This forum contains %1$s and %2$s.’, ‘bbpress’ ), $topic_text, $reply_text );
}

} else {

if ( !empty( $topic_count ) ) {

if ( bbp_is_forum_category( $forum_id ) ) {
$retstr = sprintf( esc_html__( ‘This category contains %1$s.’, ‘bbpress’ ), $topic_text );
} else {
$retstr = sprintf( esc_html__( ‘This forum contains %1$s.’, ‘bbpress’ ), $topic_text );
}

} else {
$retstr = esc_html__( ‘This forum is empty.’, ‘bbpress’ );
}
}
}

の青色の部分を削除しました。

「このトピックには 0件の返信 、 1人の参加者 が含まれます。 最終更新 by syun 5 日、 22 時間前.」も削除する事にしました。

pluginsの中の
includes・・・topics・・・template.php
の3368行付近の

function bbp_get_single_topic_description( $args = ” ) {

// Parse arguments against default values
$r = bbp_parse_args( $args, array(
‘topic_id’ => 0,
‘before’ => ‘<div class=”bbp-template-notice info”><p class=”bbp-topic-description”>’,
‘after’ => ‘</p></div>’,
‘size’ => 14
), ‘get_single_topic_description’ );

// Validate topic_id
$topic_id = bbp_get_topic_id( $r[‘topic_id’] );

// Unhook the ‘view all’ query var adder
remove_filter( ‘bbp_get_topic_permalink’, ‘bbp_add_view_all’ );

// Build the topic description
$vc_int = bbp_get_topic_voice_count ( $topic_id, true );
$voice_count = bbp_get_topic_voice_count ( $topic_id, false );
$reply_count = bbp_get_topic_replies_link ( $topic_id );
$time_since = bbp_get_topic_freshness_link( $topic_id );

// Singular/Plural
$voice_count = sprintf( _n( ‘%s voice’, ‘%s voices’, $vc_int, ‘bbpress’ ), $voice_count );

// Topic has replies
$last_reply = bbp_get_topic_last_reply_id( $topic_id );
if ( !empty( $last_reply ) ) {
$last_updated_by = bbp_get_author_link( array( ‘post_id’ => $last_reply, ‘size’ => $r[‘size’] ) );
$retstr = sprintf( esc_html__( ‘This topic contains %1$s, has %2$s, and was last updated by %3$s %4$s.‘, ‘bbpress’ ), $reply_count, $voice_count, $last_updated_by, $time_since );

// Topic has no replies
} elseif ( ! empty( $voice_count ) && ! empty( $reply_count ) ) {
$retstr = sprintf( esc_html__( ‘This topic contains %1$s and has %2$s.‘, ‘bbpress’ ), $voice_count, $reply_count );

// Topic has no replies and no voices
} elseif ( empty( $voice_count ) && empty( $reply_count ) ) {
$retstr = sprintf( esc_html__( ‘This topic has no replies.‘, ‘bbpress’ ), $voice_count, $reply_count );
}

// Add the ‘view all’ filter back
add_filter( ‘bbp_get_topic_permalink’, ‘bbp_add_view_all’ );

// Combine the elements together
$retstr = $r[‘before’] . $retstr . $r[‘after’];

// Return filtered result
return apply_filters( ‘bbp_get_single_topic_description’, $retstr, $r );
}

の青色の部分を削除しました。

余計な部分を削除して、すっきりしたと思います。

 

PHPで思うようにsleep()が動作しない

2020年6月12日

30日分の安い宿一覧を、楽天APIのデータを使って表示するPHPプログラムを製作していたのですが、一部の処理を手動にしていたのを全自動で更新できるようにしました。

その際、処理内容を画面で確認するために、途中で処理結果の表示を持続したかったのですが、処理を指定した時間だけ止めるsleep()が効かないんです。

随分頑張って、試行錯誤したのですが解決できず、最後に頼るのはYAHOO!知恵袋です。

原因は、時間がかかる処理をした場合、ブラウザの仕様でバッファをフラッシュするためのようです。
echoコマンドを実行した後に
@ob_flush();
@flush();
を挿入して、その後に
sleep(40);
を挿入すると画面表示した後に、表示を一定時間(今回の場合は40秒)停めて、その後に新しい処理に移る事ができるようになりました。

これで、30日分の最安値宿一覧を、更新内容を確認しながら全自動で更新できるようになりました。やったね。

2020年6月14日

40秒停めても、画面を見続けないといけない事が面倒なので、表示以後の別ウインドウでさせたほうが便利だと気づきました。
PHPで新しいウインドウを開くのが難しく、Javaスクリプトを使わなければいけない事がわかり、実際に試したのですが、うまく動作しませんでした。
結局、アップロードする前に<form   target=”_blank”>で希望通りの処理ができることが分かりました。これだと表示を一定時間(今回の場合は40秒)停止も不要になります。

<body onload=”document.all.jikkou.click();”>
<form action=”https://kimassi.net/insert25.php” method=”post” target=”_blank”>
<input type=”hidden” name=”up_file” value=”<?= urlencode(file_get_contents(‘../../../data/output/csv-put2.csv’)) ?>”>
<input type=”submit” value=”up” name=”jikkou”>
</form>
</body>

csv-put.csvファイルをデータベース(MySQ)に

2020年5月30日

現在30日分の安い宿一覧表示について、

1.ローカルのxampp上で楽天APIのデータをcsvファイルとしてハードディスクに保存2.coreserver上のMySQLにアクセスし、テーブルyasuiyadoを選択し先ほどエクスポートしたcsvファイルをインポートする。
フォーマット特有のオプションUpdate data when duplicate keys found on import (add ON DUPLICATE KEY UPDATE)にチェックを入れてインポート)

という作業について、1の部分はPHPで自動でやっているのですが、2の部分は手動でやっているのです。
2の部分もPHPで自動で動作できれば、凄く楽になります。
なんとかならないか調べてみました。

xampp上のPHPからxampp上にあるcsvファイルをcoreserver上にアップロードする事は、なんとかできました。
あとはアップロードしたcsv-put.csvの内容を、サーバーのデータベース(MySQ)に登録することに成功すれば、データベースの自動更新が完成します。

2020年6月7日

結構、苦戦しています。
PHPはバージョンによって仕様が変わるので、過去の情報が役に立たない場合が多いのです。
参考書も、現在のPHPのバージョンにものでないと正常に動作しないし、ネットの情報も、ほとんど役立ちません。

coreserverのデータベースに接続するのは、データベース名がkimassi_yado、ユーザー名がkimassi_yadoなので

<?php
try {
$dsn=’mysql:host=127.0.0.1;dbname=kimassi_yado’;
$db = new PDO($dsn, ‘kimassi_yado’, ‘パスワード’);
} catch (PDOException $e) {
echo ‘DB接続エラー: ‘ . $e->getMessage();
}
?>

csv-put2.csvを開いてデータを配列に変換するのは

<?php
$row = 1;
// ファイルが存在しているかチェックする
if (($handle = fopen(“csv-put2.csv”, “r”)) !== FALSE) {
// 1行ずつfgetcsv()関数を使って読み込む
while (($data = fgetcsv($handle))) {
$row++;

//ここに処理の内容を記入
}
}
fclose($handle);
?>

でできます。テーブルのカラムはid,no,date,check,hotelNo,yadomeiで、配列は

idの内容が$data[0]
noの内容が$data[1]
dateの内容が$data[2]
checkの内容が$data[3]
hotelNoの内容が$data[4]
yadomeiの内容が$data[5]
ryoukinの内容が$data[6]

であることは確認できています。それをデータベースに登録保存するところがうまくいきません。
テーブル名がyasuiyadoなので

$sql =’INSERT INTO yasuiyado (no,date,check,hotelNo,yadomei,ryoukin) VALUES (“$data[1]”,”$data[2]”,”$data[3]”,”$data[4]”,”$data[5]”,”$data[6]”) ‘;
$stmt = $pdo->prepare($sql);
$stmt->execute();

上記で正常に動作するはずなんですが、一行も保存されません。

$sql =”UPDATE yasuiyado SET no=$date[1],date=$date[2],check=$date[3],hotelNo=$date[4],yadomei=$date[5],ryoukin=$date[6]) WHERE id=$date[0]”;

でも一行も保存されません。

2020年6月8日

正常に動作しない原因は、coreserverのデータベースにデータを保存する場合の$sql の構文の問題のようです。

$sql =”INSERT INTO `yasuiyado` (`id`, `no`, `date`, `check`, `hotelNo`, `yadomei`, `ryoukin`) VALUES (‘$data[0]’, ‘$data[1]’, ‘$data[2]’, ‘$data[3]’, ‘$data[4]’, ‘$data[5]’, ‘$data[6]’)”;
$stmt = $db->prepare($sql);
$stmt->execute();

で動作するようになりました。” と ` と ‘ の使い分けが重要のようです。
ちなみにsqlの書式はサーバーによって違うようです。
$sqlは、実際に手動でデータを1件登録してみて、その時のsqlを表示させて調べることができました。

<?php
try {
$dsn=’mysql:host=127.0.0.1;dbname=kimassi_yado’;
$db = new PDO($dsn, ‘kimassi_yado’, ‘パスワード’);
} catch (PDOException $e) {
echo ‘DB接続エラー: ‘ . $e->getMessage();
}
?>
<?php
$row = 1;
// ファイルが存在しているかチェックする
if (($handle = fopen(“csv-put2.csv”, “r”)) !== FALSE) {
// 1行ずつfgetcsv()関数を使って読み込む
while (($data = fgetcsv($handle))) {
$row++;

$sql =”INSERT INTO `yasuiyado` (`id`, `no`, `date`, `check`, `hotelNo`, `yadomei`, `ryoukin`) VALUES (‘$data[0]’, ‘$data[1]’, ‘$data[2]’, ‘$data[3]’, ‘$data[4]’, ‘$data[5]’, ‘$data[6]’)”;
$stmt = $db->prepare($sql);
$stmt->execute();
}
}fclose($handle);
?>

全部まとめて動作させたら、思った通りにいかなくて一瞬焦りましたが、PHPファイルをUnicode(UTF-8)で保存するのを忘れていました。思わぬところで落とし穴があるものです。
ファイルに日本語が入っていないと、エディターで読み込むときにシフトJISで読み込みます。その状態で編集して保存すると、シフトJISで保存されてエラーになってしまうのです。
どこかに日本語を入れておいてUnicode(UTF-8)で保存すれば次回からは自動でUnicode(UTF-8)になるので便利です。

そういう訳で無事、自動化が出来ました。
パソコンは、この処理専用のマシンにしたので、パソコンの電源を入れるだけで自動にデータベースのデータを更新できるようになりました。

2020年6月14日

更新が正常に行われていない事に気づきました。
やっぱり更新はINSERT INTOでは駄目なようです。最初からINSERT INTOで動作するのが不思議だったのです。
UPDATEが正しいのだと思います。3つだけ更新する場合のUPDATEのsqlは

UPDATE `yasuiyado` SET `hotelNo` = ‘1607242’, `yadomei` = ‘Blue Hour Kanazawa2’, `ryoukin` = ‘2400’ WHERE `yasuiyado`.`id` = 1

でした。ちなみにsqlの書式はサーバーによって違うようです。

$sql =”UPDATE `yasuiyado` SET `date` = ‘$data[2]’,`check` = ‘$data[3]’, `hotelNo` = ‘$data[4]’,`yadomei` = ‘$data[5]’, `ryoukin` = ‘$data[6]’ WHERE `yasuiyado`.`id` = $data[0]” ;

で正常に動作しました。

xampp上のcsvファイルをcoreserver上にアップロード

2020年5月24日

現在30日分の安い宿一覧表示について、

1.ローカルのxampp上で楽天APIのデータをcsvファイルとしてハードディスクに保存

2.coreserver上のMySQLにアクセスし、テーブルyasuiyadoを選択し先ほどエクスポートしたcsvファイルをインポートする。
フォーマット特有のオプションUpdate data when duplicate keys found on import (add ON DUPLICATE KEY UPDATE)にチェックを入れてインポート)

という作業をしているのですが、1の部分はPHPで自動でやっているのですが、2の部分は手動でやっているのです。
2の部分もPHPで自動で動作できれば、凄く楽になります。
なんとかならないか調べてみようと思います。

最初に躓いたのは、coreserver上のMySQLにcoreserver以外からアクセスする事です。MySQLへのアドレスが判らないのです。
coreserverからだとmysql:host=127.0.0.1;dbname=kimassi_yadoでアクセスできるのですけど。

2020年5月25日

coreserverの運営会社に問い合わせしました。

coreserverでは外部からデータベースへの接続は出来ない仕様となっておりますため、希望の
動作は出来ないという返答がありました。

それで、1つ思いつきました。
coreserver上のMySQLに、csvファイルをインポートさせるのは、coreserver上のPHPファイルにさせることにして、xampp上からcoreserver上のPHPファイルを動作させれば、思い通りの処理を自動で行えるのではないかと
問題は、coreserver上のPHPファイルでパソコン上のcsvファイルをアップロードさせることができるかです。ネット上のPHPがパソコンのデータを操作できるとなるとセキュリティ上問題があるかので出来ないかもしれません。。
xampp上のPHPからxampp上にあるcsvファイルをcoreserver上にアップロードして、coreserver上のPHPファイルを自動で動作させて、coreserver上のMySQLに、coreserver上のcsvファイルをインポートさせるというのは可能かもしれません。

2020年5月30日

xampp上のPHPからxampp上にあるcsvファイルをcoreserver上にアップロードする方法が判りました。困った時のYAHOO知恵袋でアドバイスいただいたのです。

Xampp上の下記のPHPファイルで

<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title></title>
</head>
<body onload=”document.all.jikkou.click();”>
<form action=”https://kimassi.net/insert.php” method=”post”>
<input type=”hidden” name=”up_file” value=”<?= urlencode(file_get_contents(‘../../../data/output/csv-put.csv’)) ?>”>
<input type=”submit” value=”up” name=”jikkou”>
</form>
</body>
</html>

サーバー上のinsert.phpを呼び出して、下記のinsert.phpでサーバー上にcsv-put.csvを書き込めました。

<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title></title>
</head>
<body>
<?php
$files = “csv-put.csv”;
file_put_contents($files,urldecode($_POST[‘up_file’] ) );
?>
</body>
</html>

あとはアップロードしたcsv-put.csvの内容を、サーバーのデータベース(MySQ)に登録することに成功すれば、データベースの自動更新が完成します。

2020年6月11日

全部まとめて動作させたら、思った通りにいかなくて一瞬焦りましたが、PHPファイルをUnicode(UTF-8)で保存するのを忘れていました。思わぬところで落とし穴があるものです。
ファイルに日本語が入っていないと、エディターで読み込むときにシフトJISで読み込みます。その状態で編集して保存すると、シフトJISで保存されてエラーになってしまうのです。
どこかに日本語を入れておいてUnicode(UTF-8)で保存すれば次回からは自動でUnicode(UTF-8)になるので便利です。

金沢の安い宿のページのSEO対策

2020年5月22日

「きまっし金沢」に「金沢の安い宿」というページがあるのですが、以前はGoogle検索で一番最初に表示されていたのですが、最近ではGoogle検索から完全に外されています。
「金沢の安い宿」のページは、オリジナルのマップ(宿名のところをクリックすると該当の宿の情報に飛ぶ)もあるし、宿一覧もあって、おのおのの宿の必要最小限の情報(公式サイトへのリンクも含む)やオリジナルの画像も掲載されています。
それに加えて、30日間の最安値の宿とその価格も掲載されているので、かなり強力なページだと自負しています。
そのページがなんで、Google検索から完全に外されているのか、原因は判っているのです。
各宿から、アフィリエイトで楽天トラベルのページへのリンクを入れてあるからなんです。
最近のGoogle検索では、アフィリエイトのリンク数が多いページは一番嫌われているようなんです。
50以上もアフィリエイトのリンクコードを入れてあれば、嫌われるはずです。

そこで、作戦を考えました。「金沢の安い宿」のページからアフィリエイトのリンクコードを全て削除して、フレーム内のPHPページの30日間の最安値の宿とその価格一覧で宿名にアフィリエイトのリンクコードを埋め込むという作戦です。
30日間の最安値の宿に表示されるの宿はせぜい、10個程度なので、PHPでアフィリエイトのリンクコードを埋め込むのは、それほど難しい事では無いと思うのです。
フレーム内のPHPページは、「金沢の安い宿」のページ本体とは別ページ扱いになるので、「金沢の安い宿」のページはアフィリエイトは無いという事になり、SEO的には格段に強化されると思うのです。

2020年5月23日

さっそく変更しました。
データベースに宿ナンバーを登録して、最安値の登録が予想される12の宿の宿ナンバーの場合は宿名のかわりに宿名入りのアフィリエイトを表示するPHPプログラムに変更しました。
効果が表れると良いです。

2020年7月29日

SEO対策上の効果が表れていません。
「金沢の安い宿」のページで「保護されていない通信」という表示がある事に気づいて調べたら、リンク先の不備が見つかり修正しました。

2020年9月28日

宿の公式サイトへのアドレスがhttpからhttpsに変わったのに、そのままになっているのが多いことに気づきました。
公式サイトのアドレスを全部チェックする必要があります。

2021年1月20日

フレーム内にPHPを埋め込んだページは全てGoogleの検索対象から外れました。
やっぱりPHPを使うのはSEO対策上では不利なようです。