Sık karşılaşılan WordPress sorunları ve hızlı çözümler
![margarit-web-reklam-bilisim-2020](https://www.margarit.com.tr/wp-content/uploads/2020/09/Margarit-Web-Reklam-Bilisim-5794840.jpg)
WordPress CMS sistemine ait bir çok güzel özellik mevcut iken, açık kaynak kodlu olması sebebiyle bir çok eklenti ve tema özelliği birbiriyle çelişir nitelikte çakışma yaşayabilir. Ek olarak milyonların tercih ettiği bir sistem olmasına karşın WordPress hazır içerik yönetim sistemi, özel alanlarda zayıf kalabilir ve manuel müdahaleye ihtiyaç duyabilir. Kendi ihtiyaçlarınız için kendinize özel çözümler üretebilmeniz için açık kaynak kodlu dağıtılan WordPress sisteminin zaten Dünya çapında kullanılan ve en çok tercih edilen sistemlerden biri olmasının gerçek sebebi de yine bu özelliğidir.
Ancak bazı sorunlar vardır ki, müdahale etmeden kurtulamazsınız, bunlardan birkaçını sizlerle paylaşıp seri çözüm yollarını ifade etmeye çalışacağız.
WordPress Cannot redeclare get_avatar_url() hatası çözümü
Cannot redeclare get_avatar_url() hatasıyla ilgili arşiv amaçlı çözümü araştırdığımız makalelere ve uyguladığımız yönteme dayanarak kayıtlı kalması amacıyla WordPress sever dostlarımızla birlikte kullanmak üzere ekliyoruz.
Temanız ile ilgili düzenlemeleri yapmanız üzere functions.php dosyasında kodları değiştiriyorsunuz.
Eski kod:
function get_avatar_url( $get_avatar ) {
preg_match("/src='(.*?)'/i", $get_avatar, $matches);
return $matches[1];
}
Yeni kod:
if(!function_exists('get_avatar_url')){
function get_avatar_url( $get_avatar ) {
preg_match("/src='(.*?)'/i", $get_avatar, $matches);
return $matches[1];
}
}
WordPress yazı içeriklerine eklenti kullanmadan görüntüleme sayısı ekleme
SQL komutlarıyla kolayca WordPress konu görüntüleme sayısıyla oynayabilirsiniz.
Yazılarınıza sahte görüntüleme eklemek için binlerce alternatif method varken, temanızın içerisindeki functions.php dosyasına eklenen bir kod ile dilediğiniz kadar ek rakam ilave edebilir ve bu noktadaki eksiklerinizi manuel olarak telafi edebilirsiniz.
functions.php içerisine:
function getPostViews($postID){
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if($count==''){
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
return "0 View";
}
return $count.' Views';
}
function setPostViews($postID) {
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if($count==''){
$count = 0;
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
}else{
$count++;
update_post_meta($postID, $count_key, $count);
}
}
// Remove issues with prefetching adding extra views
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
sonra single.php ve index.php içerisinde istediğimiz yere yapıştırıyoruz.
<?php
echo getPostViews(get_the_ID());
?>
W3 Total Cache benzeir bir cache eklentisi mevcutsa ek bir kod ihtiyacımız olabilir:
<!-- mfunc setPostViews(get_the_ID()); --><!-- /mfunc -->
Güncelleme yapıyorum.
Functions.php içerisine:
function getPostViews($postID){
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if($count==''){
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
return "0 View";
}
return $count.' Views';
}
function setPostViews($postID) {
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if($count==''){
$count = 0;
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
}else{
$count++;
update_post_meta($postID, $count_key, $count);
}
}
single ve index gibi sayfalar içerisine:
önce:
<?php
echo getPostViews(get_the_ID());
?>
sonra:
<?php
setPostViews(get_the_ID());
?>
WordPress Woocommerce Front Page Dropdown Droplist Ekleme
Başlık çok fazla ingilizce oldu farkındayım. Ancak zaten kendime arşiv amaçlı unutmamak için saatlerimizi harcadıktan sonra çözdüğümüz sistemi not olarak eklemek amacıyla yazıyoruz.
<div class="col-md-3 webfilter" id="profilter">
<div class="prolist col-md-10 errormsg" >
</div>
<div class="prolist col-md-10" >
<input type="hidden" id="ajaxpath" value="<?php echo get_bloginfo('template_directory').'/getproducts.php'; ?>" />
<select name="brand" class="homedrop" id="brand">
<option value="">Manufacturer</option>
<?php
$args=array(
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'hierarchical' => 0,
'style' => 'none',
'taxonomy' => 'product_cat',
'depth' => 0,
'parent' => 0
);
$res = get_categories($args);
foreach($res as $result) {
echo '<option value="'.$result->term_id.'">'.$result->name.'</option>' ;
}
?>
</select>
</div>
<div class="prolist col-md-10">
<select name="model" class="homedrop" id="model">
<option>Model</option>
</select>
</div>
<div class="prolist col-md-10">
<select name="motor" class="homedrop" id="motor">
<option>Engine</option>
</select>
</div>
<div style="color:#FFF !important;" id="findproduct" class="cs-btn-align text-center"><a href="#" style="color:#FFF !important;" class="dropbutton cs-btn cs-btn-outlined avc cs-btn-rounded cs-btn-outlined-accent cs-btn-sm">FIND MY VEHICLE</a></div>
</div>
bu kod bize ana sayfada widget olarak kullanacağımız görseli ve seçmeli menüyü sunmuş oldu.
Şimdi $category fonksiyonu ile sitemizdeki tüm içeriği listelemek için kademeleri isimlendirip almak adına fonksiyon dosyası oluşturalım.
<?php
require_once( dirname(__FILE__) . '/../../../wp-load.php' );
if($_POST['action'] == 'brand') {
$brandid = $_POST['brand'];
$args=array(
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'hierarchical' => 0,
'style' => 'none',
'taxonomy' => 'product_cat',
'depth' => 0,
'parent' => $brandid
);
$childs = get_categories($args);
$result = array();
$i = 0;
foreach($childs as $child) {
$result[$i]['id'] = $child->term_id;
$result[$i]['name'] = $child->name;
$i++;
}
echo json_encode($result);
die();
}
if($_POST['action'] == 'model') {
$brandid = $_POST['brand'];
$args=array(
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'hierarchical' => 0,
'style' => 'none',
'taxonomy' => 'product_cat',
'depth' => 0,
'parent' => $brandid
);
$childs = get_categories($args);
$result = array();
$i = 0;
$baseurl = get_bloginfo('url');
foreach($childs as $child) {
$result[$i]['id'] = $baseurl.'/product-category/'.$child->slug;
$result[$i]['name'] = $child->name;
$i++;
}
echo json_encode($result);
die();
}
if($_POST['action'] == 'search'){
$args = array(
'post_type' => 'product',
'posts_per_page' => -1
);
$wp_query = new Wp_Query($args);
$posts = $wp_query->posts;
$result = array();
$i = 0;
foreach($posts as $post) {
$result[$i]['label'] = $post->post_title;
$result[$i]['value'] = get_the_permalink($post->ID);
$thumbid = get_post_thumbnail_id($post->ID);
$result[$i]['img'] = wp_get_attachment_image( $thumbid, 'thumbnail' );
if($result[$i]['img'] == '') {
$result[$i]['img'] = '<img width="80" height="80" src="https://dummyimage.com/80x80/8f8f80/fff.png&text=No+image" class="attachment-thumbnail" alt="product-img" />';
}
$i++;
}
//print_r($result); exit;
echo json_encode($result);
die();
}
?>
Yapıyı tanımladık ama kendi içerisinde dönüştürmüş olduğum brand uygulamasına dair bir dosyayı da taksonomi tutarlılığı için eklemem lazım.
Bu yüzden aşağıdaki dosyayı da yine aynı şekilde getproducts.php dosyasında olduğu gibi oluşturup tema ana dizinine açıyorum.
<?php
/**
*
* Template for Brand taxonomy
* @since 1.0.0
* @version 1.0.1
*
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
$term = get_queried_object();
$parent_id = empty( $term->term_id ) ? 0 : $term->term_id;
$product_categories = get_categories( apply_filters( 'woocommerce_product_subcategories_args', array(
'parent' => $parent_id,
'menu_order' => 'ASC',
'hide_empty' => 0,
'hierarchical' => 1,
'taxonomy' => 'product_cat',
'pad_counts' => 1
) ) );
if ( $product_categories ) {
get_header( 'shop' );
get_template_part( 'templates/page-header' );
$cs_post_meta = get_post_meta( $post->ID, '_custom_page_options', true );
$cs_page_layout = ( isset ( $cs_post_meta['sidebar'] ) ) ? $cs_post_meta['sidebar'] : 'full';
$cs_page_column = ( $cs_page_layout == 'full' ) ? '12' : '9';
$vc_use_default = cs_get_option( 'vc_use_default' );
$cs_page_padding = ( $vc_use_default !== true ) ? 'md-padding' : '';
if( ( $cs_page_layout == 'fluid' || isset( $cs_post_meta['section'] ) ) && $vc_use_default !== true ) {
get_template_part('templates/page', 'section');
} else { ?>
<section class="main-content <?php echo $cs_page_padding; ?> page-layout-<?php echo $cs_page_layout; ?>">
<div class="container">
<div class="row">
<?php cs_page_sidebar( 'left', $cs_page_layout ); ?>
<div class="col-md-<?php echo $cs_page_column; ?> cs-sidebar-clear">
<div class="page-content">
<?php foreach ( $product_categories as $category ) {
$category_link = get_category_link( $category );
echo '<a href="'. esc_url( $category_link ).' "> <div class="col-md-2 b-tab" attr="'.$category->cat_ID.'" >'.$category->name.'</div> </a>';
}
?>
</div>
</div>
<?php cs_page_sidebar( 'right', $cs_page_layout ); ?>
</div>
</div>
</section>
<?php }
get_footer();
}else{
wc_get_template( 'archive-product.php' );
}
özel listeleme gibi bir sayfamız varsa (find my vehicle) template değiştiriyoruz.
<?php
/**
*
* Template Name: Brand
* @since 1.0.0
* @version 1.0.1
*
*/
get_header();
get_template_part( 'templates/page-header' );
$cs_post_meta = get_post_meta( $post->ID, '_custom_page_options', true );
$cs_page_layout = ( isset ( $cs_post_meta['sidebar'] ) ) ? $cs_post_meta['sidebar'] : 'full';
$cs_page_column = ( $cs_page_layout == 'full' ) ? '12' : '9';
$vc_use_default = cs_get_option( 'vc_use_default' );
$cs_page_padding = ( $vc_use_default !== true ) ? 'md-padding' : '';
if( ( $cs_page_layout == 'fluid' || isset( $cs_post_meta['section'] ) ) && $vc_use_default !== true ) {
get_template_part('templates/page', 'section');
} else {
?>
<section class="main-content <?php echo $cs_page_padding; ?> page-layout-<?php echo $cs_page_layout; ?>">
<div class="container">
<div class="row">
<?php cs_page_sidebar( 'left', $cs_page_layout ); ?>
<div class="col-md-<?php echo $cs_page_column; ?> cs-sidebar-clear">
<div class="page-content">
<?php
$args=array(
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'taxonomy' => 'product_cat',
'depth' => 0,
'parent' => 0
);
$res = get_categories($args);
foreach($res as $result) {
$category_link = get_category_link( $result );
echo '<a href="'. esc_url( $category_link ).' "> <div class="col-md-2 b-tab" attr="'.$result->cat_ID.'" >'.$result->name.'</div> </a>';
}
?>
</div>
</div>
<?php cs_page_sidebar( 'right', $cs_page_layout ); ?>
</div>
</div>
</section>
<?php
}
get_footer();
SSL aktivasyonu sonrası siteyi htaccess ile https ve 301 yönlendirme
Siteniz var, http ile kurdunuz, mysql ve php kullanıyorsunuz.
SSL sertifikası satın aldınız veya Let’s Encrypt tarzı bir sistemle https yönlendirmesi yapmak istiyorsunuz.
Özellikle WordPress kullanıcısıysanız ve düzinelerce eklenti denediyseniz, boş yere çabaladınız.
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
URL are not cached by some proxy caching servers hatası ve çözümü
Bir çok cache sistemi kullandınız, hala “?” uzantılı .css ve .js dosyalarıyla ilgili sıkıntı yaşıyorsunuz değil mi?
Çünkü bu değişkene sahip dosyalar statik değil, bu sebepten ön bellekleme yapılamıyor.
Ancak aşağıdaki kodu temanızın functions.php en alt satırına yerleştiriyorsunuz ve bingo.
/**
* Remove Query strings from Static Resources.
*/
function remove_cssjs_ver( $src ) {
if( strpos( $src, '?ver=' ) )
$src = remove_query_arg( 'ver', $src );
return $src;
}
add_filter( 'style_loader_src', 'remove_cssjs_ver', 10, 2 );
add_filter( 'script_loader_src', 'remove_cssjs_ver', 10, 2 );
WordPress ve Woocommerce yavaşlık sorunu için hızlı çözüm
Woocommerce kullanıcısı olarak binlerce ürün yelpazeniz var ise, maalesef kasan sisteminiz için bir çok eklenti yükleyip de Cache sistemleri ile çare bulmaya çalışırsınız.
Ancak Woocommerce tüm dünyaya hitap eden bir sistem olduğu için, gerekli gereksiz bir çok fonksiyonu eş zamanlı mecburen çalıştıran bir sistemdir. Bu yükü hafifletmek için gereksiz gördüğünüz fonksiyon dağılımını hafifletebilirsiniz, bu sayede kullanmadığınız özellikler sistem tarafından çağırılmaz ve size hız/zaman kazandırır.
Aşağıda vermiş olduğum kodu temanızın functions.php dosyasına eklemeniz yeterli, sonrasında dilediğiniz satırları silebilir veya başkalarını da siz ekleyebilirsiniz. Bu sayede gözle görünür bir hız kazanacağınızdan eminim!
add_action( 'wp_enqueue_scripts', 'child_manage_woocommerce_styles', 99 );
function child_manage_woocommerce_styles() {
//remove generator meta tag
remove_action( 'wp_head', array( $GLOBALS['woocommerce'], 'generator' ) );
//first check that woo exists to prevent fatal errors
if ( function_exists( 'is_woocommerce' ) ) {
//dequeue scripts and styles
if ( ! is_woocommerce() && ! is_cart() && ! is_checkout() ) {
wp_dequeue_style( 'woocommerce_frontend_styles' );
wp_dequeue_style( 'woocommerce_fancybox_styles' );
wp_dequeue_style( 'woocommerce_chosen_styles' );
wp_dequeue_style( 'woocommerce_prettyPhoto_css' );
wp_dequeue_script( 'wc_price_slider' );
wp_dequeue_script( 'wc-single-product' );
wp_dequeue_script( 'wc-add-to-cart' );
wp_dequeue_script( 'wc-cart-fragments' );
wp_dequeue_script( 'wc-checkout' );
wp_dequeue_script( 'wc-add-to-cart-variation' );
wp_dequeue_script( 'wc-single-product' );
wp_dequeue_script( 'wc-cart' );
wp_dequeue_script( 'wc-chosen' );
wp_dequeue_script( 'woocommerce' );
wp_dequeue_script( 'prettyPhoto' );
wp_dequeue_script( 'prettyPhoto-init' );
wp_dequeue_script( 'jquery-blockui' );
wp_dequeue_script( 'jquery-placeholder' );
wp_dequeue_script( 'fancybox' );
wp_dequeue_script( 'jqueryui' );
}
}
}
WordPress ve CSS ile mobil bileşen görünebilirliği ayarlama
Responsive mantığı ortaya çıktığından beri en çok aranan özelliklerden biri olarak mobil görünürlük dile gelmeye başladı. Amatör tema yazar arkadaşlarım sıkça aradığı mobilde görünsün, masaüstünde görünsün gibi opsiyonları kolayca nasıl halledebiliriz diye düşündükleri noktada basit bir iki kod ile css dosyası düzenleyerek bu sorunu ortadan kaldırabiliyorsunuz.
Örnek olarak reklam üzerinden kodlama yapalım.
<div class="reklamalani">
<!-- reklam kodunu buraya ekleyin -->
</div>
/* mobilde görünmesin */
@media (max-width:992px){
.reklamalani{display:none}
}
Böylelikle reklam alanı içerisine yerleştirdiğiniz reklam kodunuz masa üstünde görünür olacak iken, mobilde, daha doğrusu 992px ekran ve altındaki değerlerde görünmez olacaktır.