セキュリティ上の理由によりこのファイル形式は許可されません

wordpress のファイルアップ時にタイトルのようなエラーが表示される場合、WPのVersionアップをお勧めします。

ローカル環境などで古いWPを利用している場合は以下のいずれかの方法で解消されます。

1.wp-config.php にてアップファイル種類を開放する。

define(‘ALLOW_UNFILTERED_UPLOADS’, true);

2.wp-include/function.php のアップロード時の拡張子チェックをカスタマイズする(おススメできません)

3.プラグインで回避する。

 

参考

WordPressの「セキュリティ上の理由によりこのファイル形式は許可されません」エラーの処理方法

 

WordPressのサイト移行にAll in One Migration

WordPressもどんどんバージョンアップしてますが、サーバ環境が古いとどうにもなりません。

今回はWPを先にPHP5.2の環境に入れてから、サーバをアップグレードするという事で、WPの古いものを敢えてインストールして、サーバのアップグレード後にPHP7 への移行にという事になりました。

その際に気を付けるのが、WPコアのVersionに対してプラグインやテーマが対応しているかという事です。

また試験サーバから本番への移行にも移行前環境がPHP5.2なので、プラグインもその環境で動く必要があるものを選定しています。

タイトルのマイグレーションについてですが、テーマ-カスタマイズやPageBuilderを利用してる場合は必須と考えていいかと思います。

DBのwp-postmeta にテーマ-カスタマイズやPageBuilderの情報が入っているのですが、それらがオブジェクトからシリアライズ化された形式で格納されているんですよね。

PHP5.2からの移設の場合、このデータを引き継がなきゃいけないのですが、これが大変です。

そんな時に『All in One Migration』です。似たプラグインで『Duplicater』というものがありましたが、こちらは古いWPには対応していない(おそらくPHP5.3以上)ようでした。

(5.2と5.3の違いって色々あるけど、namespace サポート辺りじゃないかな)

ただ、『All in One Migration』を使うのに、大きなデータの移設は有料となるので、ファイル移設後、DBとテーマデータのみ移設できるようにしておくといいと思います。

 

 

 

 

 

StaticPressでHTML吐出しできない場合

StaticPressを利用していて、HTMLの吐出しができなくなったので参考になったURLをメモしておきます。

https://blogenist.jp/2018/05/13/4154/

 

StaticPressの使い方とハマった話

StaticPressでhtml出力が出来なかった問題について

それとそもそもStaticPressの不具合もあるようで、まさにこちらのURLで記載されているところでハマってしまっていました。

StaticPressで再構築ボタンを押した際に処理中のまま止まってしまう場合の対処方法

wordrpessのpage builder(ページビルダー)機能をサイト引越し時に移植する

WordPressのpage builder系のプラグインを持っているテーマもありますが、これがテストサイトから本番サイトへ移設する際にドメインの文字列数変更で

うまく表示されなくなってしまうという現象があります。

昨日記事で「wp_postmetaのシリアライズ化されたデータを加工する(テーマオプション・ドメイン変更対応)」を書きましたが、page builder の移設の場合も原因は同じでした。昨日の記事では、シリアライズ化されたデータに対して再帰的な処理が出来てなかった為テーマオプションの一部までしか移植できてなかったのかもしれません。

phpの内部処理は同じです。一度配列化し、置換してから再度シリアライズ化します。out.txt というファイルにupdate 構文のSQLを置くことで、phpMyadminからpage builder のpostmeta 情報に対してUpdateしてもらえれば、無事移植できるかと思います。


<?php
// ---------------------------------
// エスケープ文字を忘れずに!
// ---------------------------------
$before = "http:\/\/blog.zamuu.net\/before";
$after = "http:\/\/blog.zamuu.net\/after";
$DB_HOST = 'mysql418.db.sakura.ne.jp';
$DB_USER = 'sante-corp';
$DB_PASS = 'sante753;
$DB_NAME = 'sante-corp_wp_sante';

/**************************
* シリアライズデータの変換
**************************/
function convert($meta_value){
$serial_data = $meta_value;
$serial_data = mb_convert_encoding($serial_data, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

// デシリアライズ化(Object形式でなく配列で返却)
$ary = unserialize($serial_data);
if(is_array($ary) === false){
echo "ary ERROR !!!f";
return false ;
}
//多次元配列を再帰的に処理して 'before' をすべて 'after' に置き換える。
array_walk_recursive($ary, function (&$val, $key) {
$val = str_replace($before, $after, $val);
});
return serialize($ary);
}
$arrOut = array();

try{
// ----------------- DB
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
$mysqli->set_charset("utf8");
$sql = "SELECT * FROM wp_postmeta WHERE meta_key='page_builder'";
// echo $sql;
if ($result = $mysqli->query($sql)) {
// 連想配列を取得
while ($row = $result->fetch_assoc()) {
// var_dump($row);
$rest = convert($row["meta_value"]);
$ret = "update wp_postmeta set meta_value= '" . $rest . "' where meta_id=" . $row["meta_id"];
array_push($arrOut, $ret);
}
// 結果セットを閉じる
$result->close();
}
// ----------------- DB
}catch(Exception $e){
echo $e;
}

foreach($arrOut as $k => $v){
$line = $v . ";\r\n";
file_put_contents("out.txt" , $line, FILE_APPEND);
}
// var_dump($arrOut);

?>

&nbsp;

wp_postmetaのシリアライズ化されたデータを加工する(テーマオプション・ドメイン変更対応)

WPの移設の際、テーマオプションの引越しに手間取っていました。毎回手打ちで更新しなおすのが手間でした。

DBマイグレーションに近いプラグインも探しましたが中々できなかったので自分で変換コードを作ってしまいました。wp options importer と組み合わせて使います。

wp_postmeta に格納されるテーマオプションは、シリアライズ化されているので、それらを一度JSON→配列化→置換→JSON出力という流れで実装しました。

テーマオプションの場合について移設作業の一括移設ができましたので、記事にします。Builderという機能で記事内部のデータをwp_postmetaで管理するプラグインがあるようですが、そちらには対応しきれてないと思います。

手順1.  wp_options_importer プラグインを移設前と新しいドメインのサイトに入れておく。

手順2. WPをコピー、DBもコピーする(DBはエクスポートしてから、ドメイン名の一括置換をしてインポートする)

手順3. 手順2のファイルやエクスポートしたDBで新しいサイトを構築。

手順4. wp_options_importer をそれぞれのサイトで有効化。移設前の方でoptions のエクスポートを実施。JSONで出力されます。

手順5. 出力されたJSONはUTF8で保存しなおし、サーバへUPします。

手順6. 以下ソースをconvert.php ファイルとしてサーバに置きます。その後、$before/$after 変数を置換したい文字列へ変更します。また、”wp_options.20180127.json”のファイル名も適切なファイル名へ変更します。URLの場合はスラッシュのエスケープを忘れずに。


<?php
// ---------------------------------
// エスケープ文字を忘れずに!
// ---------------------------------
$before = "http:\/\/blog.zamuu.net\/before";
$after = "http:\/\/blog.zamuu.net\/after";

$json = file_get_contents("wp_options.20180127.json");
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$ary = json_decode($json, true);

//多次元配列を再帰的に処理して 'before' をすべて 'after' に置き換える。
array_walk_recursive($ary, function (&$val, $key) {
$val = str_replace($before, $after, $val);
});

$json_arry = json_encode($ary);
file_put_contents("out.json" , $json_arry);

?>

手順6.  サーバへ置いたphpへブラウザからアクセスして実行すると out.json ができます。これがURL返還後のjsonファイルになります。

手順7. 移設後のサイトの方で out.json をインポートします。

追加でこちら「wordrpessのpage builder(ページビルダー)機能をサイト引越し時に移植する」も記載したのでリンクしておきます。

 

wordpressで各ページで共通となる単語・文章を管理する

WordPressで共通文言を管理する為に便利なのがショートコードとカスタムフィールドの組合せです。今回はこの共通文言の作り方を記事にします。

どういうときに使うかというと、日本語サイト独特なような気もするのですが、「・・・できます」「・・・可能です」の統一。「お問合せ」「お問い合わせ」という送り仮名の統一・・・数ページのサイトならいいですが、百ページにも及ぶサイトでこれらの類似文言を統一させるのはかなり手間です!

これらを1か所で管理できると便利だなー、という事がきっかけで自作関数を作ったのですが、これが意外と便利なので公開しておきます。少しでもWebコーディングやデザインされている人の助けになれば幸いなのですが。

今回は、『「エンドユーザ様」「利用者さま」「ご利用者様」というバラバラの文言を「ご利用者さま」に統一する』という前提で以下記載していきます。

『アドバンストカスタムフィールド(ACF)』というプラグインでカスタムフィールドを定義します。

1.アドバンスドカスタムフィールドというプラグインをインストールしてください。

2.ホームとなる固定ページなどに共通となるカスタムフィールドを作成します。今回は「ユーザ」というラベルに「user」というフィールド名、デフォルト値を「ご利用者さま」にしています。

3.追加したカスタムフィールドは、ホームとして設定している固定ページである「トップ」という固定ページのみに表示させるように設定します。

4.「トップ」という固定ページを管理画面-固定ページから開くと、カスタムフィールドに「ご利用者さま」と反映されているかと思います。この状態で1度ページを更新します。これで「トップ」というページのカスタムフィールド:user に「ご利用者さま」が設定されました。

共通名称用のショートコードを作成します

5.事前に「トップ」という固定ページのページIDを確認してください。ページIDの確認方法は、「固定ページ」一覧のタイトル部分をマウスオーバーすれば、URLがブラウザ状にリンク先として表示されたりします。post=xxx という部分がページのIDとなります。

5.外観 – テーマの為の関数(function.php)を開きます。ここでショートコードを作成するのですが、関数名が長くなってはコーディングも大変で意味がないのでできるだけ簡潔な関数名にします。ここでは「ご利用者さま」(user)という事で [usr] というショートコードを想定します。

6.以下のようなコードをfunction.php に追記しましょう。xxxはページID、’user‘ はカスタムフィールド名です。


function usrFunc(){ return get_post_meta(xxx, 'user', true); }

add_shortcode('usr', 'usrFunc');

 

7.この状態で固定ページの記事本文にショートコードを設定していきます。固定ページであれ、記事投稿ページであれ、本文のお客様、利用者様と記載する部分に[usr] と設定することで文言が統一されます。

  • 変更前:弊社のサービスではお客様が分かりやすいサービスを展開してます。
  • 変更後: 弊社のサービスではご[usr]が分かりやすいサービスを展開してます。

ちょっと応用編

共通文言がかけるという事は共通的なHTMLも記載できます。カスタムフィールドのタイプをテキストからテキストエリアにすることで共通的なHTMLがかけるようになります。

 

 

WordPress4.7系のREST-API脆弱性による一部誤解について

長くなりますが、ブログ投稿が妥当そうですので。
世界的シェアをもつWordPressの今回のニュースは、国内の中小零細・大企業・官公庁サイトで何万件もの改ざん攻撃の指摘を受けています。
大きく影響を受けるのはREST APIが標準搭載されたver4.7.0/ver4.7.1です。
【ITmedia】
ITmediaさんを特定するわけではないのですが、社会的な影響度が大きいからニュースになったのでしょうが、タイトル見ると『WordPress≒セキュリティ弱い』と誤解されそうです。
『WordPress≒逆にセキュリティ対策が早い。但しシェアが大きい為社会影響が大きい。』と思ってもらった方がいいなぁ。
初版4.7.0をリリース後48hour以内に既に脆弱性をつかれ、4.7.1で対処しさらに4.7.2というところでしょうか。(リリースノート確認してません)

“WordPress4.7系のREST-API脆弱性による一部誤解について” の続きを読む

さくらレンタルサーバのWordPressでユーザ情報更新時にInternalServerError(500)

WordPressのマルチサイトでユーザー追加時に500エラー』まさにこの症状がでたのですが、メール周りでもなさそうだったので、以下のように継続調査しました。

タイトルのように、『Internal Server Error 500』が表示されたときは、以下箇所を疑ってみます。

.htaccess の書き方の間違い

htaccess内のBasic認証やAccess denyなどの設定、Permanentなどの記述方法ミス、不要な全角スペースがある、などを疑います。

PHP のプログラムミス

プログラム記載ミスや処理の記述がないか疑います。

php.ini の記述ミス

さくらレンタルサーバの場合、php.ini はコントロールパネルから提供されています。この中に記載ミスがないか調査します。

それでも原因不明な時は・・・

コントロールパネルから提供されているエラーログを確認します。

今回、私の環境でエラーログには、『malformed header from script. Bad header=/home/hoge/dead.letter… S:』が表示されていました。

それと合わせて、php.iniのエラー表示もありphp.iniを見てみました。結果、原因はphp.iniの記載ミスでした。

 

BuddyPressをカスタマイズ

BuddyPressプロフィール一覧上部に、カスタム文章を表示する。さらに、表示・編集で切り替える。


add_action('bp_before_profile_field_content', 'account_details_display_howto' ); // 登録画面文章表示
add_action('bp_before_account_details_fields', 'account_details_display_howto' ); // 登録画面文章表示
// 新規アカウント登録時のタイトル設定
function zam_before_register_page() {
echo "&lt;h2&gt;" . get_the_title(6) . "&lt;/h2&gt;";
return "";
}

登録メンバー一覧のサムネイルや、掲載情報を修正する場合は

/home/ippin-dou/www/test/wp-content/plugins/buddypress/bp-templates/bp-legacy/buddypress/members/members-loop.php を直接修正するか、add_action(bp_directory_members_item, functionxxxx) を追加すればよい。

プロフィールの一覧上部に任意の文章を追記する

Buddypressでプロフィール表示画面の、一覧表となる上部にBuddyPressのプロフィール拡張プラグイン『Buddypress xProfile Rich Text Field』で追加・追記した文章を表示させます。
以下のコードでは、プロフィール項目A,B,Cの項目を表示させる処理です。add_action() でアクションフックに登録し、プロフィール情報をecho させるのみです。

$count_loop = FALSE; // 同一画面で複数回CallBackされたカウント
add_action( 'bp_before_profile_field_content', 'bp_before_profile_func');
function bp_before_profile_func(){
    global $count_loop;
    global $bp;
    
    // 初回のみ表示させる
    if($count_loop) return ;
    else $count_loop = TRUE;
    // echo bp_displayed_user_id();
    $profile_title="タイトル";
    $corp_name = xprofile_get_field_data('[プロフィール項目A]', bp_displayed_user_id());  
    $corp_picture = xprofile_get_field_data('プロフィール項目B', bp_displayed_user_id());  
    $catchecopy = xprofile_get_field_data('プロフィール項目C', bp_displayed_user_id());  
    if($catchecopy != "")  $profile_title = $catchecopy;

    $profile_descript= xprofile_get_field_data('プロフィール項目D' ,bp_get_member_user_id());
    $profile_text = nl2br($profile_descript);
    echo <<<_PROFILE_INF_
	<h2>{$corp_name}</h2>
	{$corp_picture}
        <strong id="bf_profile_title">{$profile_title}</strong>
        <p id="bf_profile_desc">{$profile_text}</p>
_PROFILE_INF_;
}

howto-user-metaslider

WordPress Plugin のMetaSliderはスライド画像を容易に設定できるプラグインです。複数の画像スライドショーを作成、管理できます。残念ながら動画スライドショーはできません。「MasterSlider」プラグインであれば、Youtubeなどの動画コンテンツの埋め込んだスライダーも作成できます。

MetaSliderの場合、表示設定時はPHPに直接埋め込んでもできますし、記事・固定ページへショートコードで入れ込むことも可能です。

“howto-user-metaslider” の続きを読む