サポート » 使い方全般 » 静的ページに変換

  • http://bmky.net/index.php?p=129

    ↑を利用してやってみたのですが内容が出力されません。

    一応ログファイルは書き出しているようです。
    ログファイルにアクセスすると

    Not Found
    Sorry, but you are looking for something that isn’t here.

    になってしまいます。

    デザインはテンプレートを読み込んでいるのでうまくいっていると思いますが…

    どなたか教えてください。

    static.phpです。

    <?php
    	require( './wp-blog-header.php' );
    	$_GET['m']	= sprintf( "%02d", $_GET['m'] );
    	$logdir		= "diary" . $_GET['y'] . "/";
    	$logfile	= $_GET['y'] . $_GET['m'] . ".html";
    	$posts		= makeMonthly( $_GET['y'] . $_GET['m'] );
    
    	//出力を全てバッファに
    	ob_start( );
    
    	//テンプレート読み込み
    	include( "tmpl_log.php" );
    
    	//バッファを取得
    	if( $buffer = ob_get_contents( ) ) {
    		if( !is_dir( $logdir ) ) {
    			mkdir( $logdir );
    		}
    		//書き込み
    		if( $fp = fopen( $logdir . $logfile, "w" ) ) {
    			fwrite( $fp, $buffer );
    			fclose( $fp );
    
    			//管理画面にリダイレクト
    			if( !$_GET['c'] ) {
    				header( "Location: wp-admin/" );
    			}
    		}
    		else {
    			echo "File Open Error !";
    		}
    	}
    
    	//バッファをクリア
    	ob_end_clean( );
    
    //月間のログを取得
    function makeMonthly( $the_month )
    {
    	global $post, $posts, $tableposts, $wpdb, $id, $tablecomments;
    	$now	= current_time( 'mysql' );
    	$posts	= $wpdb->get_results( "SELECT DISTINCT * FROM $tableposts WHERE post_date <= '$now' AND (post_status = 'publish') AND (date_format(post_date, '%Y%m') = '$the_month') GROUP BY $tableposts.ID ORDER BY post_date" );
    	uasort( $posts, "cmp" );
    	return $posts;
    }
    
    //日付昇順時間降順にソート
    function cmp( $a, $b ){
    	$a_ymd	= str_replace( "-", "", substr( $a->post_date, 0, 10 ) );
    	$a_time	= str_replace( ":", "", substr( $a->post_date, 12 ) );
    	$b_ymd	= str_replace( "-", "", substr( $b->post_date, 0, 10 ) );
    	$b_time	= str_replace( ":", "", substr( $b->post_date, 12 ) );
    	if( $a_ymd == $b_ymd )	return ( $a_time < $b_time );
    	else					return ( $a_ymd > $b_ymd );
    }
    ?>

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター IKEDA Yuriko

    (@lilyfan)

    http://bmky.net/index.php?p=129
    ↑を利用してやってみたのですが内容が出力されません。

    引用先の記事は「投稿日 2004年9月22日」ということで、2008年現在では、まったく参考にならないものです。あと、本日 (12月20日) に追記されたようで、「現在の WordPress では使えません」「WP Super Cache を使う方がおすすめ」とも書かれています。

    なので、すっぱりと WP-Cache や WP Super Cache を使うことを検討してみてください。

    こういう、WordPress に関するノウハウ記事やは、執筆された日時が重要です。最新の WordPress を使っているならば、少なくとも1年以内の記事でないと参考になりません。2006年以前の記事は、内容が古く、現在では使えないと思った方がよいです。(記事自体は、WordPress の歴史を示す文書という意味で値打ちはあるんですが……)

    ウェブ検索 (特に Google) は古い記事を拾ってしまうことがあるため、検索エンジンで見つけたページは、内容の鮮度を確認することが重要です。もし日付が入ってないならば、古い内容である可能性を疑ってみる必要もあります。

    # あと、上記のスクリプトは、現在の WordPress で使えない以前に重大な問題点があって、使うべきではありません (作者にも連絡ずみ)。

    モデレーター jim912

    (@jim912)

    sakurai07さん、こんにちは。

    上記のスクリプトですが、そのままの利用には問題があります。
    というのも、誰でも実行できてしまう上に、$_GET[‘y’]パラメータの検証が全くなされていません。
    下手をすれば、ディレクトリトラバーサルにより、同じサーバに同居している他サイトのファイルを書き換えてしまう可能性さえあります。

    まずは、2行目に

    if ( ! preg_match( '/^[\d]{4}$/', $_GET['y'] ) ) { exit; }
    if ( ! preg_match( '/^[\d]{1,2}$/', $_GET['m'] ) ) { exit; }

    の2行を追加して、パラメータが数字であるか検証するようにしてください。

    次にスクリプトの動作ですが、書き出されない原因を把握するために、下記2点を確認ください。

    1. static.phpと同じフォルダにtmpl_log.phpはあるか?
    2. バッファの取得が出来ているか?
      バッファの取得確認は、

      if( $buffer = ob_get_contents( ) ) {

      の1行下に

      ob_clean(); echo 'buffer ok'; exit;

      を追加し、文字が出力されれば問題ありません。
      ※ 確認後は、追加したコードは削除してください。

    tmpl_log.phpがない場合は、そもそもバッファが生成されませんので、ファイルの書き出しも行われません。
    tmpl_log.phpがあるのに、バッファが取得できないのであれば、tmpl_log.phpになんらかの問題があるのではないかと考えられます。

    トピック投稿者 sakurai07

    (@sakurai07)

    ご返答ありがとうございます。

    WP-Cache や WP Super Cacheを調査してみます。ありがとうございます。

    >>jim912
    ‘buffer ok’が出力されました。フォルダもdiary2008が表示され中には200812.htmlができていますが、削除してからも
    Not Found
    Sorry, but you are looking for something that isn’t here.

    に、なります。

    tmpl_log.phpですが、デフォルトテーマですがあっていますでしょうか?
    すいません勉強不足で、昨日からWordPressはじめたばかりで…

    <?php get_header(); ?>
    
    	<div id="content" class="narrowcolumn">
    
    	<?php if (have_posts()) : ?>
    
    		<?php while (have_posts()) : the_post(); ?>
    
    			<div class="post" id="post-<?php the_ID(); ?>">
    				<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__('Permanent Link to %s', 'kubrick'), the_title_attribute('echo=0')); ?>"><?php the_title(); ?></a></h2>
    				<small><?php the_time(__('F jS, Y', 'kubrick')) ?> <!-- by <?php the_author() ?> --></small>
    
    				<div class="entry">
    					<?php the_content(__('Read the rest of this entry &raquo;', 'kubrick')); ?>
    				</div>
    
    				<p class="postmetadata"><?php the_tags(__('Tags:', 'kubrick') . ' ', ', ', ''); ?> <?php printf(__('Posted in %s', 'kubrick'), get_the_category_list(', ')); ?> | <?php edit_post_link(__('Edit', 'kubrick'), '', ' | '); ?>  <?php comments_popup_link(__('No Comments »', 'kubrick'), __('1 Comment »', 'kubrick'), __('% Comments »', 'kubrick'), '', __('Comments Closed', 'kubrick') ); ?>
    
    			</div>
    
    		<?php endwhile; ?>
    
    		<div class="navigation">
    			<div class="alignleft"><?php next_posts_link(__('&laquo; Older Entries', 'kubrick')) ?></div>
    			<div class="alignright"><?php previous_posts_link(__('Newer Entries &raquo;', 'kubrick')) ?></div>
    		</div>
    
    	<?php else : ?>
    
    		<h2 class="center"><?php _e('Not Found', 'kubrick'); ?></h2>
    		<p class="center"><?php _e('Sorry, but you are looking for something that isn’t here.', 'kubrick'); ?>
    
    		<?php include (TEMPLATEPATH . "/searchform.php"); ?>
    
    	<?php endif; ?>
    
    	</div>
    
    <?php get_sidebar(); ?>
    
    <?php get_footer(); ?>

    宜しくお願いします

    モデレーター IKEDA Yuriko

    (@lilyfan)

    下手をすれば、ディレクトリトラバーサルにより、同じサーバに同居している他サイトのファイルを書き換えてしまう可能性さえあります。

    ディレクトリートラバーサル以外にもとんでもない脆弱性があるのですが、具体的内容について書くのは控えさせていただきます (作者に報告ずみ)。

    の2行を追加して、パラメータが数字であるか検証するようにしてください。

    m パラメーターは、sprintf で数値に矯正しているので、一応安全でしょう。
    検証するならば、単に数値であることだけではなく、m は 1から12の値であること、y は1900から現在の年までの値であることを検査した方がよいと思います。

    $year = intval($_GET['y']);
    if (! is_numeric($_GET['y']) || $year < 1900 || $year > date('Y'))
        exit;
    $month_num = intval($_GET['m']);
    if (! is_numeric($_GET['m']) || $month_num < 1 || $month_num > 12)
        exit;
    $month = sprintf( "%02d", $month_num );
    $logdir = 'diary' . $year . '/';
    $logfile = $year . $month . '.html';
    $posts = makeMonthly( $year . $month );

    でも、スクリプトの作者も書いている通り、現在の WordPress では動作しない *らしい* ので、すっぱりとあきらめて WP-Cache, WP Super Cache を使うことをおすすめします。
    また、static.php が誰でも実行可能という設計はセキュリティー的にいまいちで、2008年に使うものではありません (2004年当時ならよかったかもしれませんが)。

    とにかく、このスクリプトをどうにか使おうという試みは無駄な努力だということを認識しましょう。

    トピック投稿者 sakurai07

    (@sakurai07)

    >>lilyfan
    ご返信ありがとうございます。

    WP-Cache, WP Super Cacheをググってみたのですがどちらの方がオススメでしょうか?

    モデレーター IKEDA Yuriko

    (@lilyfan)

    WP-Cache, WP Super Cacheをググってみたのですがどちらの方がオススメでしょうか?

    WP Super Cache は WP-Cache の機能を内包しているので、自信の技術に自信があれば Super Cache の方を試してみるとよいでしょう。
    独自の .htaccess を作ったりと手間がかかるので、そういうのが分からなければ、WP-Cache に留めておく方が無難です。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「静的ページに変換」には新たに返信することはできません。