Kullanıcı profili sayfasına yorum mu yapıyorsunuz?


9

Bu öğreticinin rehberliğinde özel kullanıcı profili oluşturmaya çalışıyorum: WordPress profil sayfası nasıl yapılır

Temamı başarıyla uyguladım, her şey iyi çalışıyor. Şimdi elde etmek istediğim şey, diğer kayıtlı kullanıcıların profil sayfasında yorum yazabileceği kullanıcı profili sayfasında, örneğin facebook duvarı veya last.fm shoutbox gibi yorum şablonu almaktır.

Ben böyle deniyorum:

Yazar sayfasına şu satırı ekledim:

<?php comments_template(); ?>

Ama görünmüyor. Sonra bu şekilde denedim: WordPress yorumları WordPress dışında alın

Yorum şablonunu iyi ekler, ancak çalışmaz. Gönder düğmesine tıkladığınızda boş bir sayfaya yönlendirilir.

Hedefe kolayca ulaşılamadığını düşünüyorum, yorum sistemi depolamak için her kullanıcı için özel veritabanı oluşturma gerektirir, çünkü yorum sistemi arşiv veya yazar sayfası gibi diğer sayfalar için değil, yalnızca belirli sayfaların veya yayınların yorumlarını saklar.

Biri bana doğru yönü gösterebilirse, sonsuza dek minnettar olacağım.

Teşekkürler Towfiq I.

Yanıtlar:


13

Merhaba @Towfiq :

Yorumlar veritabanında Yayınlar ile ilgilidir. Yorumlar'ı Kullanıcılar ile ilişkilendirmek için çok iş yapmanız gerekir.

Kullanıcılar için bir Özel Yazı Türü oluşturmayı ve ardından ya user_metadepolamak için bir alanı ya da depolamak için post_idbir postmetaalanı user_idya da her ikisini birden kullanmayı düşündünüz mü ? Eğer bunu yaptıysanız, hiç çaba harcamadan yorumları alırsınız.

GÜNCELLEME

Aşağıda, yorumlardaki tartışmamızdan sonra geliştirilen kod verilmiştir.

Uzun zamandır böyle bir şey yazmayı kastediyorum ama soru bulmanız beni öncelik haline getirdi. Sizin için 'towfiq-person'özel bir yazı türü oluşturdum ve her kullanıcı eklendiğinde otomatik olarak bir Kişi postası eklemek için ayarladım ve bu e-posta adresini çağrılan özel bir alandaki ilişkilendirme anahtarı olarak kullanır '_email'.

Bir Kullanıcı varolan Kişisi olarak eklenebilir veya aynı e-posta ile güncellenir eğer o da Kişi mesaja uygun bir e-posta adresine sahip bir kullanıcı ilişkilendirir (şu ya. İyi bir fikir olabilir de olmayabilir de) Ve Kişinin ile Kullanıcıyı referanslar çapraz Kullanıcı PostMeta ve usermeta alanları kullanarak ile kişi '_user_id've '_person_id'sırasıyla.

Bunlar elbette uygulamayı seçtiğim iş kurallarıdır, ancak kullanım durumunuz için uygun olmayabilirler, bu durumda bunları değiştirmeniz gerekebilir. WordPress'in bu ikisinin senkronizasyondan çıkmasına izin vermesinin yollarını da bulabilirsiniz, ancak kapsamlı testler olmadan bunu bilmek zor. Sorun bulursanız, çözmek için mantığı her zaman güncellemeye bakabilirsiniz.

Aşağıdaki kodu temanızın functions.phpdosyasına kopyalayabilirsiniz :

class Towfiq_Person {
  static function on_load() {
    add_action('init',array(__CLASS__,'init'));
    add_action('wp_insert_post',array(__CLASS__,'wp_insert_post'),10,2);
    add_action('profile_update',array(__CLASS__,'profile_update'),10,2);
    add_action('user_register',array(__CLASS__,'profile_update'));
    add_filter('author_link',array(__CLASS__,'author_link'),10,2);
    add_filter('get_the_author_url',array(__CLASS__,'author_link'),10,2);
  }
  static function init() {
    register_post_type('towfiq-person',
      array(
        'labels'          => array('name'=>'People','singular_name'=>'Person'),
        'public'          => true,
        'show_ui'         => true,
        'rewrite'         => array('slug' => 'people'),
        'hierarchical'    => false,
        //'supports'        => array('title','editor','custom-fields'),
      )
    );
  }
  static function get_email_key() {
    return apply_filters( 'person_email_key', '_email' );
  }
  static function profile_update($user_id,$old_user_data=false) {
    global $wpdb;
    $is_new_person = false;
    $user = get_userdata($user_id);
    $user_email = ($old_user_data ? $old_user_data->user_email : $user->user_email);
    $email_key = self::get_email_key();
    $person_id = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' AND meta_value='%s'",$email_key,$user_email));
    if (!is_numeric($person_id)) {
      $person_id = $is_new_person = wp_insert_post(array(
        'post_type' => 'towfiq-person',
        'post_status' => 'publish',   // Maybe this should be pending or draft?
        'post_title' => $user->display_name,
      ));
    }
    update_user_meta($user_id,'_person_id',$person_id);
    update_post_meta($person_id,'_user_id',$user_id);
    if ($is_new_person || ($old_user_data && $user->user_email!=$old_user_data->user_email)) {
      update_post_meta($person_id,$email_key,$user->user_email);
    }
  }
  static function wp_insert_post($person_id,$person) {
    if ($person->post_type=='towfiq-person') {
      $email = get_post_meta($person_id,self::get_email_key(),true);
      if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $user = get_user_by('email',$email);
        if ($user) { // Associate the user IF there is an user with the same email address
          update_user_meta($user->ID,'_person_id',$person_id);
          update_post_meta($person_id,'_user_id',$user->ID);
        } else {
          delete_post_meta($person_id,'_user_id');
        }
      }
    }
  }
  static function get_user_id($person_id) {
    return get_user_meta($user_id,'_user_id',true);
  }
  static function get_user($person_id) {
    $user_id = self::get_user_id($person_id);
    return get_userdata($user_id);
  }
  static function get_person_id($user_id) {
    return get_user_meta($user_id,'_person_id',true);
  }
  static function get_person($user_id) {
    $person_id = self::get_person_id($user_id);
    return get_post($person_id);
  }
  static function author_link($permalink, $user_id) {
    $author_id = get_user_meta($user_id,'_person_id',true);
    if ($author_id) // If an associate is found, use it
      $permalink = get_post_permalink($author_id);
    return $permalink;
  }
}
Towfiq_Person::on_load();

Yaptığım ve neden yaptığım açıklamalara ihtiyacınız varsa, sadece yorumlarda sorun.


Yani, önerdiğiniz özel bir yazı türü oluşturmak ve döngü yazar sayfasına uygulamaktır. Ve sonra diğer kullanıcıların bu boş gönderiye yorum gönderebilmesi için yorum formunu doldurun. Ancak aynı yorumlar her kullanıcının profil sayfasında gösterilecektir. Bir kullanıcı kaydedildiğinde wp_insert_post () ile kullanıcı adının başlığıyla otomatik posta oluşturacak bir işlev yaratılarak önlenebilir. Gönderinin yazarı kullanıcı olabilir. Böylece, yazı döngüsünü çektiğimizde author = user ile yazının gösterildiğinden emin oluruz. Doğru yönde miyim? Karmaşık mı yapıyorum?
Towfiq

@Towfiq: Gerçekten de, kullanıcı başına authorözel gönderi türünüzden bir gönderi oluşturursunuz . Daha sonra taxonomy-author.phpşablon dosyasında, mevcut yazarın tüm yayınlarını da sorgular ve böylece yazar sayfanızı "sahte" yaparsınız . Bunu başka bir şekilde de yapabilirsiniz (yazar şablonunu kullanın ve özel gönderiyi ekleyin), ancak daha sonra doğru gönderi kimliğini kullanmak için yorum formunu kandırmanız gerekir.
Jan Fabry

Cevabınız için teşekkürler Fabry. Taksonomi hakkında çok az bilgim yok. Bu sayfadan bir şeyler almaya çalıştım: codex.wordpress.org/Template_Hierarchy#Custom Taxonomies display Ama başarısız oldu. taksonomi-author.php'nin ne olduğunu ve ne yapacağını söyleyebilir misiniz? ve ben başka bir yol denerseniz, sonrası kimliği kandırmak hakkında bir fikrin var mı ?? -teşekkür
Towfiq

@Towfiq: Benim hatam, olmamalı taxonomy-author.php, ama single-author.php. Özel bir sınıflandırma oluşturmazsınız, ancak özel bir gönderi türü oluşturursunuz. single-author.phpTek bir yayını göstermek için kullanılır şablon dosyasıdır authorözel yayın türü. Bu şekilde gitmenizi öneririm, bu en kolayıdır ( /page/2/bu yazardan çok sayıda yayınınız varsa paging ( ) öğesini de kullanabilirsiniz ).
Jan Fabry

1
@Towfiq? Kodumu incelerken bunu nasıl özledim? Hmm, özür dilerim. Her neyse, hatanın nerede meydana geldiğini bana söylemeniz ne kadar yararlı olmalı. :) Ayrıca hatasız benim ucumda çalıştı şaşırdım. BTW, daha önce farklı bir kanca kullanıyordum, bu yüzden kalan kod oldu. İşte bunu düzeltmek gerekir: if ($person->post_type=='towfiq-person') {. Bana haber ver ...
MikeSchinkel

0

Sadece author.php içine özel bir yazı türü döngüsü ekleyin ve bu özel gönderinin yorum formunu kullanın. Bunu birçok kez yaptım ve harika çalışıyor.

<?php /* Display the author's comments from the custom post type (AAA) */ ?>
<?php
$authorid = get_the_author_meta( ID, $userID );
$args=array('author' => $authorid,'post_type' => 'AAA', 'numberposts' => -1);
$cquery=new WP_Query($args);
if($cquery->have_posts()):
while($cquery->have_posts()):
$cquery->the_post();
?>          
<div class="comments-area">
    <?php comments_template(); ?>
</div>
<?
    endwhile;
        wp_reset_postdata();
    endif;
?>

https://github.com/pjeaje/code-snippets/blob/gh-pages/GP%20author.php%20with%20multiple%20loops


Yukarıdaki veya yazarın üstüne ekleyin. Php loop
Pete
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.