Secura Vita

Category: Works , WordPress , Plugins
Works

Last Viewed Posts:プラグインのエラーを修正して最新のwordrepss(5.4.1)でも使えるようにする

Tag:

Last Viewed Posts:プラグインのエラーを修正して最新のwordrepss(5.4.1)でも使えるようにする
  • twitter
  • facebook
  • はてな
  • line

見たページを記憶するプラグイン「Last Viewed Posts」を使ってたサイトがあり、そのwordrepssをアップデートするという仕事があったのですが最近更新されてないこともあってエラーがでてしまいました。

Last Viewed Posts – WordPress plugin | WordPress.org

見たページをクッキーに記憶させるという、割と単純なプラグインなので自作しても良かったのですが、このプラグインありきのサイト構築してたのと期間や費用の関係でプラグインファイルを修正することにしました。

数カ所書き換えるだけでOKですので困ってる方がいればお試しください。

執筆時バージョン:wordrepss5.4.1・プラグインver0.7.3

管理画面

修正するファイルは、プラグインディレクトリ内の「last_viewed_posts.php」です。

WP_DEBUGをtrueにしてエラーを潰していってください。

WP_DEBUGはwp-config.phpに書きます。

define('WP_DEBUG', true);
↓
define('WP_DEBUG', false);

WordPressでのデバッグ – WordPress Codex 日本語版

管理画面に出るエラーは多分WP_DEBUGをfalseにしてればスルーされるエラーだと思います。

あと、削除しても「使用停止中のウィジェット」から出ないのはそのままにしてます。
なんかデータ残ってんのかな?

エラー1

precated: register_sidebar_widget の使用はバージョン 2.8.0 から非推奨になっています ! 代わりに wp_register_sidebar_widget() を使ってください。 

Deprecated: register_widget_control の使用はバージョン 2.8.0 から非推奨になっています ! 代わりに wp_register_widget_control() を使ってください。

修正箇所は最下部にある関数「zg_lwp_init」を書き換えます。

function zg_lwp_init() { // Widget init
	if ( !function_exists('register_sidebar_widget') )
		return;
	register_sidebar_widget('Last Viewed Posts','zg_lwp_widget');
	register_widget_control('Last Viewed Posts','zg_lwp_widget_control', 250, 100);
}

↓

function zg_lwp_init() { // Widget init
	if ( !function_exists('wp_register_sidebar_widget') )
		return;
	wp_register_sidebar_widget('last-viewed-posts','Last Viewed Posts','zg_lwp_widget');
	wp_register_widget_control('last-viewed-posts','Last Viewed Posts','zg_lwp_widget_control');
}

register_sidebar_widget→wp_register_sidebar_widget、register_widget_control→wp_register_widget_controlに書き換えただけですが引数も変わってますのでご注意を。

wp_register_sidebar_widget() | Function | WordPress Developer Resources

wp_register_widget_control() | Function | WordPress Developer Resources

エラー2

ウィジェットを登録すると出るエラーです。

Notice: Undefined index: lwp-submit

Deprecated: attribute_escape の使用はバージョン 2.8.0 から非推奨になっています ! 代わりに esc_attr() を使ってください。

1つ目のエラーは単純に「lwp-submit」が見つからないというエラーなのでそれを回避します。

関数「zg_lwp_widget_control」にあります。

if ( $_POST['lwp-submit'] ) {
	$newoptions['title'] = strip_tags(stripslashes($_POST['lwp-title']));
}

↓

if ( isset($_POST['lwp-submit']) && $_POST['lwp-submit'] ) {
	$newoptions['title'] = strip_tags(stripslashes($_POST['lwp-title']));
}

2つ目のエラーは非推奨のタグを書き換えるだけです。

これも関数「zg_lwp_widget_control」にあります。

$title = attribute_escape( $options['title'] );

↓

$title = esc_attr( $options['title'] );

WEBサイト上の表示

エラー1

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

これはPHP7で起きるエラーみたいです。

preg_replaceじゃなくてpreg_replace_callbackを使えってことみたいです。

これは表示部分とクッキー処理部分の2箇所にありますのでお忘れなく。

関数は「zg_lw_setcookie」と「zg_recently_viewed」です。

違いは値を返す変数名が違うくらいです。

zg_lw_setcookie()

$zg_cookiearray = unserialize(preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", stripslashes($_COOKIE["WP-LastViewedPosts"]))); // Read serialized array from cooke and unserialize it

↓

$str = stripslashes( $_COOKIE["WP-LastViewedPosts"] );
$str = preg_replace_callback( '!s:(\d+):"(.*?)";!',
	function( $m ) {
		return "'s:'.strlen('{$m[2]}').':\"{$m[2]}\";'";
	},
	$str );
$zg_cookiearray = unserialize( $str );

zg_recently_viewed()

$zg_post_IDs = unserialize(preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", stripslashes($_COOKIE["WP-LastViewedPosts"]))); // Read serialized array from cooke and unserialize it

↓

$str = stripslashes( $_COOKIE["WP-LastViewedPosts"] );
$str = preg_replace_callback( '!s:(\d+):"(.*?)";!',
	function( $m ) {
		return "'s:'.strlen('{$m[2]}').':\"{$m[2]}\";'";
	},
	$str );
$zg_post_IDs = unserialize( $str );

エラー2

Invalid argument supplied for foreach() in

これは上の処理でエラーが回避され、$zg_post_IDsにちゃんと値が入ってれば消えます。


おもしろかった・役に立った
  • twitter
  • facebook
  • はてな
  • line
▼ブログランキング参加中!クリック!▼
  • ブログランキング・にほんブログ村へ

Comment

  1. tsujita より:

    ちょうど困っていたところだったので、大変助かりました!
    ありがとうございます。

    ただせっかく表示はされるようになったのですが、
    商品詳細ページに設置をしておりまして、クッキーからそれぞれのサムネイルが表示されるはずが、
    それぞれの詳細ページの同一ページのサムネイルのみが表示されるおかしな現象がでてしまいました。

    この設定とはまた別の問題でしょうか・・。
    お知恵をお貸しいただけると大変たすかります。

    1. あつお より:

      コメントありがとうございます。
      このプラグインはサムネイルの出力が無いのでおそらくご自身で追加した部分かと思います。
      もしよろしければその部分のソースを書いてもらえますか?
      こちらで試してみます。

    2. tsujita より:

      >あつおさま
      welcartのフォーラムの方でも質問に対してご回答いただきました。
      ご親切にありがとうございます!

      サムネイル部分はこちらのページを参考にさせていただきました。
      https://mo-ja.net/welcartlastviewedpost/

      ソースはこちらです。

      ------------------------------------------
      function zg_recently_viewed() { // Output
      	echo '';
      	if (isset($_COOKIE["WP-LastViewedPosts"])) {
      		//echo "Cookie was set.";  // For bugfixing - uncomment to see if cookie was set
      		//echo $_COOKIE["WP-LastViewedPosts"]; // For bugfixing (cookie content)
      		$str = stripslashes( $_COOKIE["WP-LastViewedPosts"] );
      		$str = preg_replace_callback( '!s:(\d+):"(.*?)";!',
          function( $m ) {
              return "'s:'.strlen('{$m[2]}').':\"{$m[2]}\";'";
          },
          $str );
      		$zg_post_IDs = unserialize( $str );
      		foreach ($zg_post_IDs as $value) { // Do output as long there are posts
      			global $wpdb;
      			$zg_get_title = $wpdb->get_results("SELECT post_title FROM $wpdb->posts WHERE ID = '$value+0' LIMIT 1");
      			foreach($zg_get_title as $zg_title_out) {
      				echo "<a href=". get_permalink($value+0) . " rel="nofollow ugc">post_title . "&gt;". usces_the_itemImage($number=0, $width=120, $height=120, $post, 'return')."</a>\n";
      			}
      		}
      	} else {
      		//echo "No cookie found.";  // For bugfixing - uncomment to see if cookie was not set
      	}
      	echo '';
      }
      ------------------------------------------
      

      お手数をおかけしてしまいすみません。大変助かります。

    3. あつお より:

      tsujita様

      サムネイルの件ですが、画像呼び出しタグに設定されてる$postが原因ですね。

      usces_the_itemImage($number=0, $width=120, $height=120, $post, 'return')
      ↓
      usces_the_itemImage($number=0, $width=120, $height=120, get_post( $value+0 ), 'return')
      

      に書き換えてみてください。
      $valu+0の+0はなんの意味かわかりませんが、このプラグインの書き方に合わせてみました。

      get_post( $value )

      でも問題ないと思います。
      $postはグローバル変数で、この関数内で$postに何も設定されていないのが原因ですね。
      参考のサイトでも

      $post = get_post($value);

      という記述がありますので確認してみてください。
      あともう1点

      post_title
      ↓
      $zg_title_out->post_title
      

      です。

    4. tsujita より:

      >あつお さま
      早々にありがとうございます。$postが原因だったのですね。
      お教えいただいた方法を試したところ無事に表示することができました。
      勉強になります。ありがとうございます!

tsujita へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ソースコードを記入する場合は [code]~[/code] でくくってください。
[code]
echo "Hello World";
[/code]

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください