• 解決済 makiko_sho

    (@makiko_sho)


    初めて投稿させていただきます。
    当方のスキルは、HTMLとCSSはわかりますが、PHPは初心者です。
    WordPressのバージョンは3.8です。

    http://wpxtreme.jp/event-calendar-with-wordpress
    上述のサイトにある様に、現在イベントカレンダーの日付の下に記事のタイトルが表示される様にしています。
    まだ運用を開始しているサイトではないのですが、タイトルにある個別記事へのリンクが
    本来であれば
    ドメイン/2013/11/30/記事ID/
    となって欲しいのですが
    ドメイン/-0001/11/30/記事ID/
    となっています。

    上述のサイトでは「動作確認バージョン WordPress 2.9.1」とあり、当方のWordPressのバージョンが違う為、うまく日付を取得しないのかと思っています。

    イベントカレンダーに記事タイトルが表示されると言うのがプラグインで見つけられなかった為、この形でチャレンジしてみましたが、行き詰っています。
    ご教授頂ければ幸いです。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • 上述のサイトでは「動作確認バージョン WordPress 2.9.1」とあり、当方のWordPressのバージョンが違う為、うまく日付を取得しないのかと思っています。

    記事のある日付を取得するのところの、preg_match_all関数の部分で、日付を取得できないか、または、カレンダーウィジェットのリンクURLが正常でないのかもしれないです。

    普通にカレンダーウィジェットを表示して、テーブル要素内のリンクがどのようになっているか確認してみると良いと思います。

    よろしければ、リンクのURLを一つ書き込んでみてください。

    トピック投稿者 makiko_sho

    (@makiko_sho)

    nobitaさん、早速のご回答ありがとうございます。

    固定ページに<?php echo get_calendar(); ?>と書き込んで表示した所、
    ドメイン/2013/11/30/記事ID/
    と言う形で日付にきちんとリンクがされており、該当の個別記事も表示されております。

    カレンダーの方は正常に動いているようです。

    改めて固定ページに<?php echo my_get_calendar(); ?>(リンク付きタイトルカレンダー)を表示した所、404エラーが返ってきて、画面上部に下記の様なメッセージが出ていました。

    Notice: Trying to get property of non-object in /home/jaaf-miyagi/public_html/wp-includes/post-template.php on line 29

    多分、こちらに投稿した時点でも出ていたと思いますが、見逃していました。
    翻訳サイトで翻訳しましたら「非オブジェクトの特性を得ようとすること」と出て来ましたが、私には良く分かりませんでした(汗
    当然ですが、wp-includes内にあるpost-template.phpは触っていません。

    2013が取得できていないので、エラーになっているのかもしれないですね

    if(preg_match_all('@<td><a href="' . get_option('home') . '/(\?m=)?([^"]*?)" title="[^"]*?">([0-9]+?)</a>@i', $output, $matches)){

    のところの正規表現を見直しが必要があるかもしれないですね

    Notice: Trying to get property of non-object in /home/jaaf-miyagi/public_html/wp-includes/post-template.php on line 29

    は、get_post()->ID;が取れないということじゃないかと思います。

    トピック投稿者 makiko_sho

    (@makiko_sho)

    ご指摘頂いた箇所、「Theme Check」と言うプラグインでも指摘されていて、「get_option(‘home’)」を「home_url()」に修正していました。
    下記の通りです。

    if(preg_match_all(
        '@<td( id="today")?><a href="' . home_url() . '/(\?m=)?([^"]*?)" title="[^"]*?">([0-9]+?)</a>@i',

    もしかしてその修正したのが問題(半角スペースが入っているとか?)かなーと、元に(該当箇所を該当HPからコピーして貼付け)戻してみましたが、やはり同じ状況です。

    Codexで「get_home_url」も出てきたので、試してみましたが同じようにエラーになります。

    トピック投稿者 makiko_sho

    (@makiko_sho)

    連投すみません。
    今日の日付でカレンダーに投稿してみたところ、本来は
    ドメイン/2014/1/11/記事ID/
    となる所
    ドメイン/-0001/11/30/記事ID/
    となっていました。
    「年」が取得出来ていないのではなく、記事の日付が取得できていないようです。
    タイトルテキストは取得できています。

    「get_option(‘home’)」を「home_url()」に修正していました。

    これは、ナイスな変更です。

    今日の日付でカレンダーに投稿してみたところ、本来は
    ドメイン/2014/1/11/記事ID/
    となる所
    ドメイン/-0001/11/30/記事ID/
    となっていました。

    これは、通常のwidgetのソースですか?それとも、カスタマイズしたカレンダーのソースですか?

    たぶん問題なのは

    '/(\?m=)?([^"]*?)"

    もともとのカレンダーウィジェットのソースが、ドメイン/2014/01/11/記事ID/(月は0付2桁、日付も同様)
    であれば、

    '/([0-9]{8})/([^"]*?)"
    
    とか
    
    '/([^/]+)/([^"]*?)"

    に変更するなどで取れるようになるかも、と思います(テストはしていないです)

    いずれにしろ、普通のウィジェットカレンダーの表示が正しくなっているかどうかを確認しないと、無駄を繰り返すことになるので、繰り返ししつこい確認をしています。

    トピック投稿者 makiko_sho

    (@makiko_sho)

    普通のカレンダーウィジェットと言うと、
    <?php echo get_calendar(); ?>で呼び出すカレンダーですよね?(すみません汗)

    固定ページに<?php echo get_calendar(); ?>を指定してカレンダーを表示しました。
    1/10にカレンダーテストと言うタイトルの記事を投稿した所、

    10

    と言う形でソースには表示されており、リンクもきちんと個別記事にされておりました。

    「連投すみません」で始まる投稿にある

    ドメイン/2014/1/11/記事ID/
    となる所
    ドメイン/-0001/11/30/記事ID/
    となっていました。

    は、上がカスタマイズ前、下がカスタマイズをした後のソースです。

    ご提案頂いた

    ‘/([0-9]{8})/([^”]*?)”
    とか
    ‘/([^/]+)/([^”]*?)”

    ですが、
    リンクが

    10

    となってしまいます。

    何度もお手を煩わせてしまって申し訳ないです。
    お願いいたします。

    コードを書き換えてみましたので、動作確認お願いできますか?

    SQL文の174は、カテゴリIDです。リンク表示する投稿のカテゴリIDに書き換えてください。

    3600sec有効のキャッシュを入れていますので、テストのときには、値を変更していただけると、確認がしやすいと思います

    コードに問題が見つかったので、一度消します

    私の環境で、動作するように書き換えてみました。

    <?php
    /**
     * Template Name: Calendar test
     *
     * Event Calendar for WordPress3.8
     * base code:http://wpxtreme.jp/event-calendar-with-wordpress
     *
     */
    
    	$cache = false;// 実用にする場合は、trueがお勧め
    
    	$result = get_transient( 'my_event_calendar_posts' );
    
    	if ( $result !== false && $cache == true ) {
    
    		echo $result;
    
    	}else{
    
    		global $wpdb;
    		$link = '';
    
    		$category_ids = '4647,5025'; //conma separated ids
    		ob_start();
    		get_calendar();
    		$output = ob_get_contents();
    		ob_end_clean();
    
    		if ( preg_match_all( '@<td([^>]*)><a href="' . home_url() . '/([^0-9]*)?([0-9/]+)?([^"]*)" title="[^"]*?">([0-9]+?)</a></td>@i', $output, $matches ) ) {
    
    			foreach($matches[3] as $key => $match){
    
    				$date  = preg_replace('@/@', '', $match );
    				$year  = substr($date, 0, 4);	// 年
    				$month = substr($date, 4, 2);	// 月
    				$day   = substr($date, 6, 2);	// 日
    
    				if ( strlen( (string) $year) !== 4 or !is_numeric( $year )  ) { wp_die( $year.'投稿年が取得できませんでした' );}
    				if ( strlen( (string) $month ) !== 2 or !is_numeric( $month ) ) { wp_die( '投稿月が取得できませんでした' );}
    				if ( strlen( (string) $day ) !== 2 or !is_numeric( $day ) ) { wp_die( '投稿日が取得できませんでした' );}
    
    				$output = str_replace( $matches[0][ $key ], md5( $matches[0][ $key ] ), $output );
    
    					$posts = $wpdb->get_results("
    						SELECT ID, post_title
    						FROM $wpdb->posts
    						  INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    						  INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    						WHERE YEAR(post_date) = '$year'
    						  AND MONTH(post_date) = '$month'
    						  AND DAY(post_date) = '$day'
    						  AND post_type = 'post' AND post_status = 'publish'
    						  AND $wpdb->term_taxonomy.taxonomy = 'category'
    						  AND $wpdb->term_taxonomy.term_id IN ($category_ids) ORDER BY post_date DESC");
    
    				foreach($posts as $post_key=>$post){
    
    					$link .= '<a class="post" href="'. get_permalink($post->ID) . '">' . $post->post_title . '</a>';
    
    					if( in_category( array($category_ids) ) and !empty( $link ) ) {
    
    						$output = str_replace(md5($matches[0][ $key ]), '<td class="event" ' . $matches[1][ $key ] . '>' . $day . $link.'</td>' , $output) ;
    					}
    				}
    			}
    		}
    		$output = preg_replace( '![0-9A-f]{32}!', '' , $output );
    		echo $output;
    		delete_transient( 'my_event_calendar_posts' );
    		set_transient( 'my_event_calendar_posts',$output, 3600 );
    	}
    ?>

    $category_ids = '4647,5025';

    カテゴリを、必ず指定してください。このままだと、本来表示されるべき投稿の日付が消えるかも知れないです。

    ob_start();
    		get_calendar();
    		$output = ob_get_contents();
    		ob_end_clean();

    を、

    $output = get_calendar(true, false);

    に修正してください

    現在のWordPressでは、get_calendarにフィルタも付いているので、

    add_filter( 'get_calendar','nobita_category_posts_by_calendar' );
    
    function nobita_category_posts_by_calendar( $output ) {
    	$cache = false;// 実用にする場合は、trueがお勧め
    
    	$result = get_transient( 'my_event_calendar_posts' );
    
    ...
    
    return $output;
    }

    という利用の仕方も可能みたいなので、検討してみてください

    トピック投稿者 makiko_sho

    (@makiko_sho)

    コードのご提供ありがとうございました。
    早速適用してみましたが、管理画面にカレンダーが出るようになってしまいました。
    画面左側のメニューの一番上です。

    純粋にカレンダーの動作を確認しようと思っていたので、function.phpにはご提供いただいたソースのみ記入しています。
    また、Wordpressの「テーマ編集」から修正するとうまく適用されなかったりしていたので、FFFTPでfunction.phpをアップロードして適用しています。
    編集ソフトは、Terapad、保存形式は、UTF-8N(BOMなし)で保存しています。

    Template Name: Calendar test

    テスト環境は、固定ページで行っています。

    functions.phpに記述用に考慮していません。関数化してください

    functions.phpに記述して、既存のget_calendarを書き換えたい場合は、コードを修正してください。

    トピック投稿者 makiko_sho

    (@makiko_sho)

    あ、なるほど。コメントアウトされていた個所をきちんと拝見していませんでした。
    失礼しました。

    ご提供いただいたコードを固定ページに反映させました。

    ドメイン/2014/01/10/記事ID

    という形で、希望通りのリンクになっていました。
    ありがとうございます。

    やはりWordpressのバージョンが違うと、色々と見直しをかけて行かないとダメなんですね。
    もっとPHPの勉強しなきゃないですね。
    そして、安易にWordpressのバージョンを最新のものにすると、危ないという事も感じました。
    関数化は、今日自力でなんとかしてみます。
    もしまたわからないことが出れば、こちらでお世話になります。

    この度はありがとうございました。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「イベントカレンダーの記事タイトルへのリンク」には新たに返信することはできません。