????
Your IP : 3.15.211.55
<?php
/**
* MagpieRSS: a simple RSS integration tool
*
* A compiled file for RSS syndication
*
* @author Kellan Elliott-McCrea <kellan@protest.net>
* @version 0.51
* @license GPL
*
* @package External
* @subpackage MagpieRSS
* @deprecated 3.0.0 Use SimplePie instead.
*/
/**
* Deprecated. Use SimplePie (class-simplepie.php) instead.
*/
_deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/class-simplepie.php' );
/**
* Fires before MagpieRSS is loaded, to optionally replace it.
*
* @since 2.3.0
* @deprecated 3.0.0
*/
do_action( 'load_feed_engine' );
/** RSS feed constant. */
define('RSS', 'RSS');
define('ATOM', 'Atom');
define('MAGPIE_USER_AGENT', 'WordPress/' . $GLOBALS['wp_version']);
class MagpieRSS {
var $parser;
var $current_item = array(); // item currently being parsed
var $items = array(); // collection of parsed items
var $channel = array(); // hash of channel fields
var $textinput = array();
var $image = array();
var $feed_type;
var $feed_version;
// parser variables
var $stack = array(); // parser stack
var $inchannel = false;
var $initem = false;
var $incontent = false; // if in Atom <content mode="xml"> field
var $intextinput = false;
var $inimage = false;
var $current_field = '';
var $current_namespace = false;
//var $ERROR = "";
var $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright');
/**
* PHP5 constructor.
*/
function __construct( $source ) {
# Check if PHP xml isn't compiled
#
if ( ! function_exists('xml_parser_create') ) {
wp_trigger_error( '', "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." );
return;
}
$parser = xml_parser_create();
$this->parser = $parser;
# pass in parser, and a reference to this object
# set up handlers
#
xml_set_element_handler($this->parser,
array( $this, 'feed_start_element' ), array( $this, 'feed_end_element' ) );
xml_set_character_data_handler( $this->parser, array( $this, 'feed_cdata' ) );
$status = xml_parse( $this->parser, $source );
if (! $status ) {
$errorcode = xml_get_error_code( $this->parser );
if ( $errorcode != XML_ERROR_NONE ) {
$xml_error = xml_error_string( $errorcode );
$error_line = xml_get_current_line_number($this->parser);
$error_col = xml_get_current_column_number($this->parser);
$errormsg = "$xml_error at line $error_line, column $error_col";
$this->error( $errormsg );
}
}
xml_parser_free( $this->parser );
unset( $this->parser );
$this->normalize();
}
/**
* PHP4 constructor.
*/
public function MagpieRSS( $source ) {
self::__construct( $source );
}
function feed_start_element($p, $element, &$attrs) {
$el = $element = strtolower($element);
$attrs = array_change_key_case($attrs, CASE_LOWER);
// check for a namespace, and split if found
$ns = false;
if ( strpos( $element, ':' ) ) {
list($ns, $el) = explode( ':', $element, 2);
}
if ( $ns and $ns != 'rdf' ) {
$this->current_namespace = $ns;
}
# if feed type isn't set, then this is first element of feed
# identify feed from root element
#
if (!isset($this->feed_type) ) {
if ( $el == 'rdf' ) {
$this->feed_type = RSS;
$this->feed_version = '1.0';
}
elseif ( $el == 'rss' ) {
$this->feed_type = RSS;
$this->feed_version = $attrs['version'];
}
elseif ( $el == 'feed' ) {
$this->feed_type = ATOM;
$this->feed_version = $attrs['version'];
$this->inchannel = true;
}
return;
}
if ( $el == 'channel' )
{
$this->inchannel = true;
}
elseif ($el == 'item' or $el == 'entry' )
{
$this->initem = true;
if ( isset($attrs['rdf:about']) ) {
$this->current_item['about'] = $attrs['rdf:about'];
}
}
// if we're in the default namespace of an RSS feed,
// record textinput or image fields
elseif (
$this->feed_type == RSS and
$this->current_namespace == '' and
$el == 'textinput' )
{
$this->intextinput = true;
}
elseif (
$this->feed_type == RSS and
$this->current_namespace == '' and
$el == 'image' )
{
$this->inimage = true;
}
# handle atom content constructs
elseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )
{
// avoid clashing w/ RSS mod_content
if ($el == 'content' ) {
$el = 'atom_content';
}
$this->incontent = $el;
}
// if inside an Atom content construct (e.g. content or summary) field treat tags as text
elseif ($this->feed_type == ATOM and $this->incontent )
{
// if tags are inlined, then flatten
$attrs_str = join(' ',
array_map(array('MagpieRSS', 'map_attrs'),
array_keys($attrs),
array_values($attrs) ) );
$this->append_content( "<$element $attrs_str>" );
array_unshift( $this->stack, $el );
}
// Atom support many links per containing element.
// Magpie treats link elements of type rel='alternate'
// as being equivalent to RSS's simple link element.
//
elseif ($this->feed_type == ATOM and $el == 'link' )
{
if ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' )
{
$link_el = 'link';
}
else {
$link_el = 'link_' . $attrs['rel'];
}
$this->append($link_el, $attrs['href']);
}
// set stack[0] to current element
else {
array_unshift($this->stack, $el);
}
}
function feed_cdata ($p, $text) {
if ($this->feed_type == ATOM and $this->incontent)
{
$this->append_content( $text );
}
else {
$current_el = join('_', array_reverse($this->stack));
$this->append($current_el, $text);
}
}
function feed_end_element ($p, $el) {
$el = strtolower($el);
if ( $el == 'item' or $el == 'entry' )
{
$this->items[] = $this->current_item;
$this->current_item = array();
$this->initem = false;
}
elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' )
{
$this->intextinput = false;
}
elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' )
{
$this->inimage = false;
}
elseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )
{
$this->incontent = false;
}
elseif ($el == 'channel' or $el == 'feed' )
{
$this->inchannel = false;
}
elseif ($this->feed_type == ATOM and $this->incontent ) {
// balance tags properly
// note: This may not actually be necessary
if ( $this->stack[0] == $el )
{
$this->append_content("</$el>");
}
else {
$this->append_content("<$el />");
}
array_shift( $this->stack );
}
else {
array_shift( $this->stack );
}
$this->current_namespace = false;
}
function concat (&$str1, $str2="") {
if (!isset($str1) ) {
$str1="";
}
$str1 .= $str2;
}
function append_content($text) {
if ( $this->initem ) {
$this->concat( $this->current_item[ $this->incontent ], $text );
}
elseif ( $this->inchannel ) {
$this->concat( $this->channel[ $this->incontent ], $text );
}
}
// smart append - field and namespace aware
function append($el, $text) {
if (!$el) {
return;
}
if ( $this->current_namespace )
{
if ( $this->initem ) {
$this->concat(
$this->current_item[ $this->current_namespace ][ $el ], $text);
}
elseif ($this->inchannel) {
$this->concat(
$this->channel[ $this->current_namespace][ $el ], $text );
}
elseif ($this->intextinput) {
$this->concat(
$this->textinput[ $this->current_namespace][ $el ], $text );
}
elseif ($this->inimage) {
$this->concat(
$this->image[ $this->current_namespace ][ $el ], $text );
}
}
else {
if ( $this->initem ) {
$this->concat(
$this->current_item[ $el ], $text);
}
elseif ($this->intextinput) {
$this->concat(
$this->textinput[ $el ], $text );
}
elseif ($this->inimage) {
$this->concat(
$this->image[ $el ], $text );
}
elseif ($this->inchannel) {
$this->concat(
$this->channel[ $el ], $text );
}
}
}
function normalize () {
// if atom populate rss fields
if ( $this->is_atom() ) {
$this->channel['description'] = $this->channel['tagline'];
for ( $i = 0; $i < count($this->items); $i++) {
$item = $this->items[$i];
if ( isset($item['summary']) )
$item['description'] = $item['summary'];
if ( isset($item['atom_content']))
$item['content']['encoded'] = $item['atom_content'];
$this->items[$i] = $item;
}
}
elseif ( $this->is_rss() ) {
$this->channel['tagline'] = $this->channel['description'];
for ( $i = 0; $i < count($this->items); $i++) {
$item = $this->items[$i];
if ( isset($item['description']))
$item['summary'] = $item['description'];
if ( isset($item['content']['encoded'] ) )
$item['atom_content'] = $item['content']['encoded'];
$this->items[$i] = $item;
}
}
}
function is_rss () {
if ( $this->feed_type == RSS ) {
return $this->feed_version;
}
else {
return false;
}
}
function is_atom() {
if ( $this->feed_type == ATOM ) {
return $this->feed_version;
}
else {
return false;
}
}
function map_attrs($k, $v) {
return "$k=\"$v\"";
}
function error( $errormsg, $lvl = E_USER_WARNING ) {
if ( MAGPIE_DEBUG ) {
wp_trigger_error('', $errormsg, $lvl);
} else {
error_log( $errormsg, 0);
}
}
}
if ( !function_exists('fetch_rss') ) :
/**
* Build Magpie object based on RSS from URL.
*
* @since 1.5.0
* @package External
* @subpackage MagpieRSS
*
* @param string $url URL to retrieve feed.
* @return MagpieRSS|false MagpieRSS object on success, false on failure.
*/
function fetch_rss ($url) {
// initialize constants
init();
if ( !isset($url) ) {
// error("fetch_rss called without a url");
return false;
}
// if cache is disabled
if ( !MAGPIE_CACHE_ON ) {
// fetch file, and parse it
$resp = _fetch_remote_file( $url );
if ( is_success( $resp->status ) ) {
return _response_to_rss( $resp );
}
else {
// error("Failed to fetch $url and cache is off");
return false;
}
}
// else cache is ON
else {
// Flow
// 1. check cache
// 2. if there is a hit, make sure it's fresh
// 3. if cached obj fails freshness check, fetch remote
// 4. if remote fails, return stale object, or error
$cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE );
if (MAGPIE_DEBUG and $cache->ERROR) {
debug($cache->ERROR, E_USER_WARNING);
}
$cache_status = 0; // response of check_cache
$request_headers = array(); // HTTP headers to send with fetch
$rss = 0; // parsed RSS object
$errormsg = 0; // errors, if any
if (!$cache->ERROR) {
// return cache HIT, MISS, or STALE
$cache_status = $cache->check_cache( $url );
}
// if object cached, and cache is fresh, return cached obj
if ( $cache_status == 'HIT' ) {
$rss = $cache->get( $url );
if ( isset($rss) and $rss ) {
$rss->from_cache = 1;
if ( MAGPIE_DEBUG > 1) {
debug("MagpieRSS: Cache HIT", E_USER_NOTICE);
}
return $rss;
}
}
// else attempt a conditional get
// set up headers
if ( $cache_status == 'STALE' ) {
$rss = $cache->get( $url );
if ( isset($rss->etag) and $rss->last_modified ) {
$request_headers['If-None-Match'] = $rss->etag;
$request_headers['If-Last-Modified'] = $rss->last_modified;
}
}
$resp = _fetch_remote_file( $url, $request_headers );
if (isset($resp) and $resp) {
if ($resp->status == '304' ) {
// we have the most current copy
if ( MAGPIE_DEBUG > 1) {
debug("Got 304 for $url");
}
// reset cache on 304 (at minutillo insistent prodding)
$cache->set($url, $rss);
return $rss;
}
elseif ( is_success( $resp->status ) ) {
$rss = _response_to_rss( $resp );
if ( $rss ) {
if (MAGPIE_DEBUG > 1) {
debug("Fetch successful");
}
// add object to cache
$cache->set( $url, $rss );
return $rss;
}
}
else {
$errormsg = "Failed to fetch $url. ";
if ( $resp->error ) {
# compensate for Snoopy's annoying habit to tacking
# on '\n'
$http_error = substr($resp->error, 0, -2);
$errormsg .= "(HTTP Error: $http_error)";
}
else {
$errormsg .= "(HTTP Response: " . $resp->response_code .')';
}
}
}
else {
$errormsg = "Unable to retrieve RSS file for unknown reasons.";
}
// else fetch failed
// attempt to return cached object
if ($rss) {
if ( MAGPIE_DEBUG ) {
debug("Returning STALE object for $url");
}
return $rss;
}
// else we totally failed
// error( $errormsg );
return false;
} // end if ( !MAGPIE_CACHE_ON ) {
} // end fetch_rss()
endif;
/**
* Retrieve URL headers and content using WP HTTP Request API.
*
* @since 1.5.0
* @package External
* @subpackage MagpieRSS
*
* @param string $url URL to retrieve
* @param array $headers Optional. Headers to send to the URL. Default empty string.
* @return Snoopy style response
*/
function _fetch_remote_file($url, $headers = "" ) {
$resp = wp_safe_remote_request( $url, array( 'headers' => $headers, 'timeout' => MAGPIE_FETCH_TIME_OUT ) );
if ( is_wp_error($resp) ) {
$error = array_shift($resp->errors);
$resp = new stdClass;
$resp->status = 500;
$resp->response_code = 500;
$resp->error = $error[0] . "\n"; //\n = Snoopy compatibility
return $resp;
}
// Snoopy returns headers unprocessed.
// Also note, WP_HTTP lowercases all keys, Snoopy did not.
$return_headers = array();
foreach ( wp_remote_retrieve_headers( $resp ) as $key => $value ) {
if ( !is_array($value) ) {
$return_headers[] = "$key: $value";
} else {
foreach ( $value as $v )
$return_headers[] = "$key: $v";
}
}
$response = new stdClass;
$response->status = wp_remote_retrieve_response_code( $resp );
$response->response_code = wp_remote_retrieve_response_code( $resp );
$response->headers = $return_headers;
$response->results = wp_remote_retrieve_body( $resp );
return $response;
}
/**
* Retrieve
*
* @since 1.5.0
* @package External
* @subpackage MagpieRSS
*
* @param array $resp
* @return MagpieRSS|bool
*/
function _response_to_rss ($resp) {
$rss = new MagpieRSS( $resp->results );
// if RSS parsed successfully
if ( $rss && (!isset($rss->ERROR) || !$rss->ERROR) ) {
// find Etag, and Last-Modified
foreach ( (array) $resp->headers as $h) {
// 2003-03-02 - Nicola Asuni (www.tecnick.com) - fixed bug "Undefined offset: 1"
if (strpos($h, ": ")) {
list($field, $val) = explode(": ", $h, 2);
}
else {
$field = $h;
$val = "";
}
if ( $field == 'etag' ) {
$rss->etag = $val;
}
if ( $field == 'last-modified' ) {
$rss->last_modified = $val;
}
}
return $rss;
} // else construct error message
else {
$errormsg = "Failed to parse RSS file.";
if ($rss) {
$errormsg .= " (" . $rss->ERROR . ")";
}
// error($errormsg);
return false;
} // end if ($rss and !$rss->error)
}
/**
* Set up constants with default values, unless user overrides.
*
* @since 1.5.0
*
* @global string $wp_version The WordPress version string.
*
* @package External
* @subpackage MagpieRSS
*/
function init () {
if ( defined('MAGPIE_INITALIZED') ) {
return;
}
else {
define('MAGPIE_INITALIZED', 1);
}
if ( !defined('MAGPIE_CACHE_ON') ) {
define('MAGPIE_CACHE_ON', 1);
}
if ( !defined('MAGPIE_CACHE_DIR') ) {
define('MAGPIE_CACHE_DIR', './cache');
}
if ( !defined('MAGPIE_CACHE_AGE') ) {
define('MAGPIE_CACHE_AGE', 60*60); // one hour
}
if ( !defined('MAGPIE_CACHE_FRESH_ONLY') ) {
define('MAGPIE_CACHE_FRESH_ONLY', 0);
}
if ( !defined('MAGPIE_DEBUG') ) {
define('MAGPIE_DEBUG', 0);
}
if ( !defined('MAGPIE_USER_AGENT') ) {
$ua = 'WordPress/' . $GLOBALS['wp_version'];
if ( MAGPIE_CACHE_ON ) {
$ua = $ua . ')';
}
else {
$ua = $ua . '; No cache)';
}
define('MAGPIE_USER_AGENT', $ua);
}
if ( !defined('MAGPIE_FETCH_TIME_OUT') ) {
define('MAGPIE_FETCH_TIME_OUT', 2); // 2 second timeout
}
// use gzip encoding to fetch rss files if supported?
if ( !defined('MAGPIE_USE_GZIP') ) {
define('MAGPIE_USE_GZIP', true);
}
}
function is_info ($sc) {
return $sc >= 100 && $sc < 200;
}
function is_success ($sc) {
return $sc >= 200 && $sc < 300;
}
function is_redirect ($sc) {
return $sc >= 300 && $sc < 400;
}
function is_error ($sc) {
return $sc >= 400 && $sc < 600;
}
function is_client_error ($sc) {
return $sc >= 400 && $sc < 500;
}
function is_server_error ($sc) {
return $sc >= 500 && $sc < 600;
}
class RSSCache {
var $BASE_CACHE; // where the cache files are stored
var $MAX_AGE = 43200; // when are files stale, default twelve hours
var $ERROR = ''; // accumulate error messages
/**
* PHP5 constructor.
*/
function __construct( $base = '', $age = '' ) {
$this->BASE_CACHE = WP_CONTENT_DIR . '/cache';
if ( $base ) {
$this->BASE_CACHE = $base;
}
if ( $age ) {
$this->MAX_AGE = $age;
}
}
/**
* PHP4 constructor.
*/
public function RSSCache( $base = '', $age = '' ) {
self::__construct( $base, $age );
}
/*=======================================================================*\
Function: set
Purpose: add an item to the cache, keyed on url
Input: url from which the rss file was fetched
Output: true on success
\*=======================================================================*/
function set ($url, $rss) {
$cache_option = 'rss_' . $this->file_name( $url );
set_transient($cache_option, $rss, $this->MAX_AGE);
return $cache_option;
}
/*=======================================================================*\
Function: get
Purpose: fetch an item from the cache
Input: url from which the rss file was fetched
Output: cached object on HIT, false on MISS
\*=======================================================================*/
function get ($url) {
$this->ERROR = "";
$cache_option = 'rss_' . $this->file_name( $url );
if ( ! $rss = get_transient( $cache_option ) ) {
$this->debug(
"Cache does not contain: $url (cache option: $cache_option)"
);
return 0;
}
return $rss;
}
/*=======================================================================*\
Function: check_cache
Purpose: check a url for membership in the cache
and whether the object is older then MAX_AGE (ie. STALE)
Input: url from which the rss file was fetched
Output: cached object on HIT, false on MISS
\*=======================================================================*/
function check_cache ( $url ) {
$this->ERROR = "";
$cache_option = 'rss_' . $this->file_name( $url );
if ( get_transient($cache_option) ) {
// object exists and is current
return 'HIT';
} else {
// object does not exist
return 'MISS';
}
}
/*=======================================================================*\
Function: serialize
\*=======================================================================*/
function serialize ( $rss ) {
return serialize( $rss );
}
/*=======================================================================*\
Function: unserialize
\*=======================================================================*/
function unserialize ( $data ) {
return unserialize( $data );
}
/*=======================================================================*\
Function: file_name
Purpose: map url to location in cache
Input: url from which the rss file was fetched
Output: a file name
\*=======================================================================*/
function file_name ($url) {
return md5( $url );
}
/*=======================================================================*\
Function: error
Purpose: register error
\*=======================================================================*/
function error ($errormsg, $lvl=E_USER_WARNING) {
$this->ERROR = $errormsg;
if ( MAGPIE_DEBUG ) {
wp_trigger_error( '', $errormsg, $lvl);
}
else {
error_log( $errormsg, 0);
}
}
function debug ($debugmsg, $lvl=E_USER_NOTICE) {
if ( MAGPIE_DEBUG ) {
$this->error("MagpieRSS [debug] $debugmsg", $lvl);
}
}
}
if ( !function_exists('parse_w3cdtf') ) :
function parse_w3cdtf ( $date_str ) {
# regex to match W3C date/time formats
$pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";
if ( preg_match( $pat, $date_str, $match ) ) {
list( $year, $month, $day, $hours, $minutes, $seconds) =
array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[7]);
# calc epoch for current date assuming GMT
$epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year);
$offset = 0;
if ( $match[11] == 'Z' ) {
# zulu time, aka GMT
}
else {
list( $tz_mod, $tz_hour, $tz_min ) =
array( $match[8], $match[9], $match[10]);
# zero out the variables
if ( ! $tz_hour ) { $tz_hour = 0; }
if ( ! $tz_min ) { $tz_min = 0; }
$offset_secs = (($tz_hour*60)+$tz_min)*60;
# is timezone ahead of GMT? then subtract offset
#
if ( $tz_mod == '+' ) {
$offset_secs = $offset_secs * -1;
}
$offset = $offset_secs;
}
$epoch = $epoch + $offset;
return $epoch;
}
else {
return -1;
}
}
endif;
if ( !function_exists('wp_rss') ) :
/**
* Display all RSS items in a HTML ordered list.
*
* @since 1.5.0
* @package External
* @subpackage MagpieRSS
*
* @param string $url URL of feed to display. Will not auto sense feed URL.
* @param int $num_items Optional. Number of items to display, default is all.
*/
function wp_rss( $url, $num_items = -1 ) {
if ( $rss = fetch_rss( $url ) ) {
echo '<ul>';
if ( $num_items !== -1 ) {
$rss->items = array_slice( $rss->items, 0, $num_items );
}
foreach ( (array) $rss->items as $item ) {
printf(
'<li><a href="%1$s" title="%2$s">%3$s</a></li>',
esc_url( $item['link'] ),
esc_attr( strip_tags( $item['description'] ) ),
esc_html( $item['title'] )
);
}
echo '</ul>';
} else {
_e( 'An error has occurred, which probably means the feed is down. Try again later.' );
}
}
endif;
if ( !function_exists('get_rss') ) :
/**
* Display RSS items in HTML list items.
*
* You have to specify which HTML list you want, either ordered or unordered
* before using the function. You also have to specify how many items you wish
* to display. You can't display all of them like you can with wp_rss()
* function.
*
* @since 1.5.0
* @package External
* @subpackage MagpieRSS
*
* @param string $url URL of feed to display. Will not auto sense feed URL.
* @param int $num_items Optional. Number of items to display, default is all.
* @return bool False on failure.
*/
function get_rss ($url, $num_items = 5) { // Like get posts, but for RSS
$rss = fetch_rss($url);
if ( $rss ) {
$rss->items = array_slice($rss->items, 0, $num_items);
foreach ( (array) $rss->items as $item ) {
echo "<li>\n";
echo "<a href='$item[link]' title='$item[description]'>";
echo esc_html($item['title']);
echo "</a><br />\n";
echo "</li>\n";
}
} else {
return false;
}
}
endif;
京都の外壁塗装で選ぶべき評判・口コミの良い業者ランキング【2021年】
京都の外壁塗装業者を徹底調査!
京都で評判の良いおすすめ外壁塗装業者ランキング!
こんにちは、「京都のおすすめ外壁塗装業者を実績・評判から厳選して10社ご紹介」の管理人です。
この度は当サイトをご覧いただきき、本当にありがとうございます。
このサイトでは、京都で生まれ育った管理人である私が、地元である京都の優良外壁塗装業者をご紹介しています。
京都にお住まいの方で、外壁塗装を検討されている方にとって少しでもお役に立てれば幸いです。
まず、なぜ私が「京都の優良外壁塗装業者」を紹介しようと思ったのか?
手短にご説明させていただきます。
実は最近、たくさんの思い出が詰まった我が家の外壁塗装工事を行いました。
築年数は約20年程。
築20年を超えたくらいのタイミングで塗り替えをしないと家の寿命が短くなってしまうと聞いたこと。
そして何より、この20年一切外壁には手をかけていなかったので、汚れが目立ち美観がすごく悪くなっていたこと。
これが初めて外壁塗装の塗り替えを検討するきっかけとなりました。
私は性格的に凝り性で、何でも自分で調べないと気が済まない性格です。
自分が納得するまで徹底的に調査して、どこよりも良い塗装業者さんを見つけて塗り替えをしてもらおう!と意気込みました。
幸いにも、私は職業柄、そして長年京都に住み続けていることもあり、建築関係(大工さん・建築士さん・設計士さんなど)の知人が複数います。
実際に行った調査方法として、その建築関係の知人と直接会い、徹底的に塗装業界を含む建築業界の生の声を聞き込みました。
その結果、納得・安心して塗り替えをお願いできる塗装業者さんと出会うことができ、仕上がり・工事金額ともに満足のいく塗り替えをすることができました。
私と同じように、
・大切な家だからこそ、丁寧にしっかりと外壁塗装をしてほしい
・少しでも安くなれば嬉しいけど、手抜き工事はされたくない
・しっかり工事内容を説明してくれるような、信頼できる塗装業者を見つけたい
とお考えの方は、きっとこのサイトが京都での塗装業者探しの参考になると信じております。
ぜひ、京都にお住まいの方で、外壁塗装を検討されている方、優良塗装業者をお探しの方の参考にしてください。
京都で信頼できる外壁塗装業者を選ぶポイント
今回、私が「優良外壁塗装業者の定義」として挙げたポイントは以下の3点です。
① 良心的な外壁塗装の金額設定
② 塗り替えの施工技術のレベルが高い
③ 対応品質・サポートがしっかりしている
恐らく皆さんにとっても、上記3点が揃っていれば優良塗装業者と言えるでしょう。
しかし、京都にも外壁塗装業者は数多くありますが、上記全てを満たす塗装業者というのは実は非常に少ないのです。
「値段が安くても、塗装工事自体の品質が悪い」
「仕上がりはすごく良いけど、工事金額が相場より明らかに高額」
「会社の規模は大きいが、施工は全て下請けに丸投げで対応が雑or下請け任せ」
など、どれか1つの項目は満たしても、他のポイントが良くないという塗装業者が圧倒的に多いのが現状です。
それでは、「優良外壁塗装業者の定義」をもう少し掘り下げてご説明します。
良心的な外壁塗装工事の金額設定
良心的な金額設定は、やはり皆さん重視したいポイントではないでしょうか?
私自身もここは絶対に外せないポイントでした。
一般的な戸建住宅の外壁塗装の価格相場は、おおよそ80万〜120万円とされています。
しかし、ただ安ければ良いという訳でない、施工品質が伴わないといけない、というのが難しいポイントです。
良心的な工事金額、その中で最大限高品質な塗り替えを行ってくれる塗装業者を見極めるポイント。
それは、
営業マンやCM・チラシなど、過剰な営業費・宣伝広告費を使っていないかどうか、です。
外壁塗装業界は、大手メーカーから地元密着型の小さな塗装業者まで、お客さんの奪い合い状態となっています。
そのため、多くの塗装業者が他社より少しでも知名度を上げるため、少しでも多くのお客さんに知ってもらうために、多額の営業費・宣伝広告費を使っています。
大手メーカーであればCM、小さな塗装業者でも新聞チラシ、そして多くの営業マンを雇い、訪問販売による営業活動を行なっているのです。
もちろん塗装業者も生活がかかっているので、営業・宣伝を行い、少しでも仕事を受注しようとするのは当然です。
しかし問題は、多額の営業費・宣伝広告費は皆さんがお支払いになる工事代金に含まれる、という点です。
過剰な営業費・宣伝広告費を使っている塗装業者は、総じて塗り替えの工事金額が高額になりがちです。
こうなると、「なぜ私たちが工事には直接関係の無い営業費・宣伝広告費を支払わないといけないのか」と思ってしまいますよね。
本当に優良な塗装業者なら、広告を出したり営業マンを雇ったりしなくても評判・口コミでお客さんは自然と集まるのです。
ただでさえ価格相場の幅が広く、工事金額の内訳がわかりにくい外壁塗装です。
気になった塗装業者が、営業マンを雇っていないか、過剰な広告を出していないか、確認してみましょう。
塗り替えの施工技術のレベルが高い
施工技術・施工品質に関しては、気にはなりますがわかりにくいポイントです。
私もそうでしたが、普段塗装工事に馴染みが無い一般の方からすれば、実際に施工している姿を見ても、技術の良し悪しを見極めるのは難しいのです。
ここで1つの見極めポイントとなるのが、「一級塗装技能士」という資格です。
この「一級塗装技能士」は、塗装の実技試験と学科試験の両方に合格した塗装職人のみが持っている資格になります。
もちろんこれは国家資格です。
資格を持っていない塗装職人さんでも、技術力が高い職人さんは沢山いらっしゃると思いますが、少なくともこの資格を持つ塗装職人さんは、一定水準以上の技術・知識を持つ塗装職人だと国から認められているのです。
気になった塗装業者に「一級塗装技能士」の取得者がいるのか、ぜひ確認しておきましょう。
塗装工事以外にも接客対応・サポートがしっかりしている
外壁塗装を検討されている方の中で、外壁塗装について精通してるという方は少ないと思います。
なぜなら、外壁塗装の塗り替え周期は10~20年に一度、知らなくても当然なのです。
むしろ私のように、「初めて外壁塗装を検討している」という人の方が多いかもしれません。
一般の方が馴染みが薄い外壁塗装工事だからこそ、対応品質・サポートがしっかりしている塗装業者の方が安心して施工を任せられるでしょう。
打ち合わせや現地調査、見積もりの段階で、「わからないことはないか?心配な点はないか?」など、気遣ってくれる塗装業者は本当に心強いです。
初めて塗り替え工事を行う方なら、尚更安心して工事を任せることができます。
こちらの些細な疑問・質問にも、丁寧にしっかり対応してくれる塗装業者を選ぶようにしましょう。
また、不思議と対応品質が良い塗装業者は、総じて塗り替えの施工品質も高いです。
やはり、真面目に誠実に塗装と向き合っている業者は、その真面目さ・誠実さが対応品質にも現れるということですね。
京都で評判の良い外壁塗装業者はどこ?
以上のことを踏まえた上で私は、複数の塗装業者から見積もりをいただき、じっくりと見積書を比較検討し、塗装業者を吟味しました。
そしてその結果、京都の中でも大変素晴らしい外壁塗装業者さんと出会うことができ、仕上がり・価格ともに満足のいく外壁塗装工事をしていただくことができました。
ここでは、私が実際に塗り替えを依頼した塗装業者さんをはじめ、
・見積もりを依頼したり問い合わせたりした際に「3つの優良外壁塗装業者の定義を満たしている」と感じた塗装業者さん
・建築業界に在籍している知人の中で評判の良い塗装業者さん
この2点を含めた、京都で安心して塗装工事を任せることができる優良外壁塗装業者さんをランキング形式でご紹介させていただきます。
ぜひ京都にお住まいの方は、優良外壁塗装業者探しの参考にしてください。
京都で評判・口コミの良い外壁塗装業者ランキング
ランキング1位
株式会社ウェルビーホーム
株式会社ウェルビーホームさんの特徴
今回、私が実際に外壁塗装の塗り替えを依頼し、最も皆さんにもおすすめしたい外壁塗装業者さんは、「株式会社ウェルビーホーム」さんです。
ウェルビーホームさんは、代表の高橋さんが直接打ち合わせ・現場調査から実際の施工、そして工事後のアフターフォローまで全て対応してくれます。
また、高橋さんは建築士の資格も持っており、外壁塗装だけでなく住まいのこと全般に精通しておられるので、様々な観点から外壁塗装に関するアドバイスをしてくれます。
高橋さん自身とても笑顔の素敵な物腰の優しい方で、外壁塗装以外の住まいに関する質問にも、とてもわかりやすく丁寧に答えてくださいました。
見積書も、他のどの業者さんよりも丁寧で詳細に作ってくださり、工事内容が非常に明確で安心できたのがウェルビーホームさんを選んだ大きなポイントです。
さらに、ウェルビーホームさんは「一級塗装技能士」の資格を所持する職人さんが在籍しています。
施工してくれた職人さん方もとても愛想良くマナーもしっかりしており、塗り替えの仕上がり・接客応対ともに大満足の結果でした。
工事金額も他業者さんと比べても安価でしたし、是非とも京都で外壁塗装を検討されている方におすすめしたい優良塗装業者さんです。
株式会社ウェルビーホームさんを利用した方の評判・口コミ
40代・女性・京都市中京区在住
外壁塗装が初めての私にも非常に丁寧にご説明くださいました。
打ち合わせの時点から高橋社長の人柄の良さは伝わりました。
見積書の内容も細かく教えてくださり、初めての外壁塗装も安心して行えました、ありがとうございました。
50代・男性・京都府城陽市在住
問い合わせから施工までやりとりがとてもスムーズでした。
特に問い合わせから現地確認までの対応の早さは一番でした。
カラーシミュレーションなど、色決めも早かったです。
仕上がりも綺麗で大満足です。
50代・女性・大阪府寝屋川市在住
前回の工事代金より大幅に安かったので大変驚きました。
こんなことなら前回の塗装工事もウェルビーホームさんにお願いしたかったです。
次回の塗装もお願いしたいので、その際はよろしくお願いします。
京都で評判・口コミの良い外壁塗装業者ランキング
ランキング2位
株式会社 佐藤塗装店
株式会社 佐藤塗装店さんの特徴
「株式会社 佐藤塗装店」さんは、京都市西京区を中心に京都府全域、大阪府、滋賀県、奈良県と幅広いエリアで活躍する塗装業者さんです。
代表の佐藤さんは、「一級塗装技能士」の資格をはじめ、「一級左官技能士」「足場組立作業主任者」など、数多くの資格を有しておられます。
塗り替えを依頼する塗装業者さんが塗装だけでなく他の建築工事に関して精通していると、幅広い視点で的確なアドバイスをもらえるので嬉しいポイントです。
佐藤塗装店さんは、日本ペイント株式会社の特約店であり、使用する塗料も日本ペイントが主になりますので、塗料の単価や性能など、工事内容が非常に明確です。
見積もりの内容も分かりやすく明瞭会計で、職人さんの対応も非常に丁寧です。
京都の数ある塗装業者の中でも、5指に入る優良塗装業者さんです。
株式会社 佐藤塗装店さんを利用した方の評判・口コミ
50代・男性・京都市西京区在住
日本ペイントの塗料と聞いて安心しましたし、塗料の知識が豊富な営業さんで、勉強になりました。
価格がわかりやすく、日本ペイントの塗料を使用しているとのことで、決めました。
仕上がりにも大変満足です。
50代・女性・兵庫県神戸市在住
住まいのイメージを変えたく、相談に乗っていただきました。
熱心に対応して頂き、次回もお願いしたいと思います。
ありがとうございました。
40代・女性・大阪府堺市在住
塗装後玄関周りの色が気に入らず、再度塗り替えて頂き有難うございました。
大満足です。ご近所様をご紹介させて頂きます。
京都で評判・口コミの良い外壁塗装業者ランキング
ランキング3位
株式会社 伊藤建装
株式会社 伊藤建装さんの特徴
「株式会社 伊藤建装」さんは、京都市伏見区を中心に京都府・滋賀県・大阪府北部で活躍する塗装業者さんです。
「一級塗装技能士」の資格保有者だけでなく、外壁診断士や外壁アドバイザーなどの資格保有者が複数在籍しておられ、まさに外壁のプロフェッショナルです。
非常に多くの塗料・プランをご用意されており、外壁診断士さんがお住まい一軒一軒に合ったプランを提案してくれます。
非常に多くの職人さんが在籍され、宣伝・広告にも力を入れておられるので、工事金額自体は決して安価ではありません。
しかし、外壁をしっかり診断してほしい・質の良い塗装工事をしてほしいといった、金額より施工品質重視の方にはおすすめの塗装業者さんです。
株式会社 伊藤建装さんを利用した方の評判・口コミ
40代・女性・京都市左京区在住
職人さん達はゴミの片付けもきっちりされていて良かったと思います。
女性の職人さんがいらっしゃったので驚きました。
足場を組む時なども男性と変わらない力強さで仕事をこなされていたので感心してました。
40代・男性・京都市西京区在住
細かいところまで綺麗にして頂き、ありがとうございました。
工事中、台風が来た時には困りましたが、結果的に綺麗に仕上げてくださり満足です。
50代・男性・滋賀県大津市在住
見積もりから施工まで、こまかいこだわりを重視してくださりありがとうございました。
家が生まれ変わったように綺麗になり感謝しています。
丁寧な職人さん達にも感謝です。