Support » Developing with WordPress » How can I hyperlink calendar days that have post

  • wosley24

    (@wosley24)


    I have a widget that was custom created to display a calendar.
    The code for the widget looks like the following:

        <?php
        
        class __themename_Most_recent_widget extends WP_Widget{
        
        	/*
        	* The constructor is what allows us to  print the Title and the description for the widget
        	* The parent contructor receives three arguments: widget name, the Title( which 
        	  receives the title and the themename), the description(an array)
        	* 
        	*/
        	    /********************* PROPERTY ********************/  
            private $dayLabels = array("Mon","Tue","Wed","Thu","Fri","Sat","Sun");
            private $currentYear=0;
            private $currentMonth=0;
            private $currentDay=0;
            private $currentDate=null;
            private $daysInMonth=0;
            private $naviHref= null;
        
            public function __construct(){
        		parent::__construct(
        			'_themename_most_recent_widget',
        			esc_html__('Recent Posts', '_themename'),
        			['description' => esc_html__('some description', '_themename')]
        		);
        	}
        
        	/*
        	* This is what gets printed in the front-end
        	* 
        	*/
        	public function widget($args, $instance){
        		echo $this->show();
        	}
             
            /********************* PUBLIC **********************/  
                
            /**
            * print out the calendar
            */
            public function show() {
                $year  == null;
                 
                $month == null;
                 
                if(null==$year&&isset($_GET['year'])){
         
                    $year = $_GET['year'];
                 
                }else if(null==$year){
         
                    $year = date("Y",time());  
                 
                }          
                 
                if( null == $month && isset($_GET['month']) ){
         
                    $month = $_GET['month'];
                 
                } elseif ( null==$month ) {
                    $month = date("m",time());
                }                  
                 
                $this->currentYear=$year;
                $this->currentMonth=$month;
                $this->daysInMonth=$this->_daysInMonth($month,$year);  
                 
                $content='<div id="calendar">'.
                                '<div class="box">'.
                                $this->_createNavi().
                                '</div>'.
                                '<div class="box-content">'.
                                        '<ul class="label">'.$this->_createLabels().'</ul>';   
                                        $content.='<div class="clear"></div>';     
                                        $content.='<ul class="dates">';    
                                         
                                        $weeksInMonth = $this->_weeksInMonth($month,$year);
                                        // Create weeks in a month
                                        for( $i=0; $i<$weeksInMonth; $i++ ){
                                             
                                            //Create days in a week
                                            for($j=1;$j<=7;$j++){
                                               $content.=$this->_showDay($i*7+$j);
                                            }
                                        }
                                         
                                        $content.='</ul>';
                                         
                                        $content.='<div class="clear"></div>';     
                     
                                $content.='</div>';
                         
                $content.='</div>';
                return $content;   
            }
             
            /********************* PRIVATE **********************/ 
            /**
            * create the li element for ul
            */
            private function _showDay($cellNumber){
        
        
                if($this->currentDay==0){
                     
                    $firstDayOfTheWeek = date('N',strtotime($this->currentYear.'-'.$this->currentMonth.'-01'));
                             
                    if(intval($cellNumber) == intval($firstDayOfTheWeek)){
                         
                        $this->currentDay=1;
                         
                    }
                }
                 
                if( ($this->currentDay!=0)&&($this->currentDay<=$this->daysInMonth) ){
                     
                    $this->currentDate = date('Y-m-d',strtotime($this->currentYear.'-'.$this->currentMonth.'-'.($this->currentDay)));
                     
                    $cellContent = $this->currentDay;
                     
                    $this->currentDay++;   
                     
                }else{
                     
                    $this->currentDate =null;
         
                    $cellContent=null;
                }
                
                $args = [
                    'post_type' => 'post',
                    'category_name' => 'events'
                ];
        
                $query = new WP_Query( $args );
        
                var_dump($currentDate);
                /*if ( $query->have_posts() ) { 
                    
                    while ( $query->have_posts() ) { 
                        
                    $query->the_post();
        
                    return '<li id="li-'.$this->currentDate.'" class="'.($cellNumber%7==1?' start ':($cellNumber%7==0?' end ':' ')).
                        ($cellContent==null?'mask':'').'"><a href="'. get_the_permalink() .'">'.$cellContent.'</a></li>';           
                         
                    }
                } else {
                    return '<li id="li-'.$this->currentDate.'" class="'.($cellNumber%7==1?' start ':($cellNumber%7==0?' end ':' ')).
                        ($cellContent==null?'mask':'').'">'.$cellContent.'</li>';
                
                wp_reset_postdata();}*/
                return '<li id="li-'.$this->currentDate.'" class="'.($cellNumber%7==1?' start ':($cellNumber%7==0?' end ':' ')).
                        ($cellContent==null?'mask':'').'">'.$cellContent.'</li>';
            }
             
            /**
            * create navigation
            */
            private function _createNavi(){
                 
                $nextMonth = $this->currentMonth==12?1:intval($this->currentMonth)+1;
                 
                $nextYear = $this->currentMonth==12?intval($this->currentYear)+1:$this->currentYear;
                 
                $preMonth = $this->currentMonth==1?12:intval($this->currentMonth)-1;
                 
                $preYear = $this->currentMonth==1?intval($this->currentYear)-1:$this->currentYear;
                 
                return
                    '<div class="header">'.
                        '<a>naviHref.'?month='.sprintf('%02d',$preMonth).'&year='.$preYear.'">Prev</a>'.
                            '<span class="title">'.date('Y M',strtotime($this->currentYear.'-'.$this->currentMonth.'-1')).'</span>'.
                        '<a>naviHref.'?month='.sprintf("%02d", $nextMonth).'&year='.$nextYear.'">Next</a>'.
                    '</div>';
            }
                 
            /**
            * create calendar week labels
            */
            private function _createLabels(){  
                         
                $content='';
                 
                foreach($this->dayLabels as $index=>$label){
                     
                    $content.='<li class="'.($label==6?'end title':'start title').' title">'.$label.'</li>';
         
                }
                 
                return $content;
            }
             
             
             
            /**
            * calculate number of weeks in a particular month
            */
            private function _weeksInMonth($month=null,$year=null){
                 
                if( null==($year) ) {
                    $year =  date("Y",time()); 
                }
                 
                if(null==($month)) {
                    $month = date("m",time());
                }
                 
                // find number of days in this month
                $daysInMonths = $this->_daysInMonth($month,$year);
                 
                $numOfweeks = ($daysInMonths%7==0?0:1) + intval($daysInMonths/7);
                 
                $monthEndingDay= date('N',strtotime($year.'-'.$month.'-'.$daysInMonths));
                 
                $monthStartDay = date('N',strtotime($year.'-'.$month.'-01'));
                 
                if($monthEndingDay<$monthStartDay){
                     
                    $numOfweeks++;
                 
                }
                 
                return $numOfweeks;
            }
         
            /**
            * calculate number of days in a particular month
            */
            private function _daysInMonth($month=null,$year=null){
                 
                if(null==($year))
                    $year =  date("Y",time()); 
         
                if(null==($month))
                    $month = date("m",time());
                     
                return date('t',strtotime($year.'-'.$month.'-01'));
            }
        
        }
        
        function __themename_register_most_recent_widget(){
        	register_widget('__themename_Most_recent_widget');
        }
        
        add_action('widgets_init', '__themename_register_most_recent_widget');
    
    What I want is the following:
    For each day of the month, It should check if there is a post on that specific day that belongs to the events category. If there is one, then that day must be hyperlinked with the post permalink.
    
    How can I achieve this?
    
    I attempted to add the loop inside the __showDay function but it hyperlinked all the days with the link of the same post.
    
        private function _showDay($cellNumber){
    
            if($this->currentDay==0){
                 
                $firstDayOfTheWeek = date('N',strtotime($this->currentYear.'-'.$this->currentMonth.'-01'));
                         
                if(intval($cellNumber) == intval($firstDayOfTheWeek)){
                     
                    $this->currentDay=1;
                     
                }
            }
             
            if( ($this->currentDay!=0)&&($this->currentDay<=$this->daysInMonth) ){
                 
                $this->currentDate = date('Y-m-d',strtotime($this->currentYear.'-'.$this->currentMonth.'-'.($this->currentDay)));
                 
                $cellContent = $this->currentDay;
                 
                $this->currentDay++;   
                 
            }else{
                 
                $this->currentDate =null;
     
                $cellContent=null;
            }
            
            $args = [
                'post_type' => 'post',
                'category_name' => 'events'
            ];
    
            $query = new WP_Query( $args );
    
            var_dump($currentDate);
            if ( $query->have_posts() ) { 
                
                while ( $query->have_posts() ) { 
                    
                $query->the_post();
    
                return '<li id="li-'.$this->currentDate.'" class="'.($cellNumber%7==1?' start ':($cellNumber%7==0?' end ':' ')).
                    ($cellContent==null?'mask':'').'"><a href="'. get_the_permalink() .'">'.$cellContent.'</a></li>';           
                     
                }
            } else {
                return '<li id="li-'.$this->currentDate.'" class="'.($cellNumber%7==1?' start ':($cellNumber%7==0?' end ':' ')).
                    ($cellContent==null?'mask':'').'">'.$cellContent.'</li>';
            }
            wp_reset_postdata();
                    ($cellContent==null?'mask':'').'">'.$cellContent.'</li>';
        }
    • This topic was modified 1 month ago by  Steve Stern.
Viewing 1 replies (of 1 total)
  • Moderator bcworkz

    (@bcworkz)

    You could use get_calendar() which returns calendar HTML with days with posts linked to the day archive. If you don’t like the HTML it produces, you can use the get_calendar filter to alter it.

    If that doesn’t get it either, review the source code as an example of what it does. In short, query for a month’s days which have posts. Build a month’s calendar by stepping through the days. When a day with posts is encountered, make it a link, otherwise just add the day number to the growing return value.

Viewing 1 replies (of 1 total)
  • You must be logged in to reply to this topic.