Заголовок вашего вопроса говорит об исключении выходных, но ваш код, похоже, не пытается это сделать?
Чтобы учесть более сложную логику, подобную этой, вероятно, разумно рассчитать период и использовать его для итерации по дням.
Примерно так:
$dateFrom = new DateTime();
$dateTo = new DateTime( '+1 month +1 second' ); // Add 1s so period includes last day.
$period = new DatePeriod( $dateFrom, new DateInterval( 'P1D' ), $dateTo );
$days = 0;
foreach ( $period as $date ) {
$day = $date->format( 'l' );
if ( 'Saturday' !== $day && 'Sunday' !== $day ) {
$days ++;
}
}
echo $days; // 23