init filtresinde veya eyleminde $ post al?


12

$ Post sadece belirli zamanlarda yürütme kancaları için kullanılabilir gibi görünüyor. $ Post-> ID kullanarak veritabanından bazı verileri çekmek için gereken bir "init" kanca var.

Şimdiye kadar benim tek geçici ihtiyacım bilgi almak için $ post kullanan the_content başka bir filtre eklemek oldu. Ne yazık ki, dönüş değerini ekrana yansıtır ve gerçekte filtreyi orijinal olarak adlandırılan işleve geri döndürmez.

İşte ihtiyacım olan verileri ayıklayan, ancak yankılar ve değeri döndüremeyen kod:

add_filter('the_content', 'get_keyword');
function get_keyword()
{
    global $post;
    $keyword = get_post_meta( $post->ID, '_wpg_def_keyword', true );
    return $keyword;
}

Herkes ihtiyacım olanı almak ve herhangi bir eklenti daha sonra kullanmak için arama işlevine geri geçmek hakkında herhangi bir öneriniz var mı?

EDIT: Muhtemelen bu daha açık hale getirmek için, DB geçerli posta hakkında bilgi almak gerekir init çalışan bir filtre var. Bunu yapmak için $ post-> ID'ye erişim gerektirir. Ama bu init içinde mümkün değil, bu yüzden ihtiyacım olan sonucu nasıl alabilirim?

Teşekkürler,

Jonathan

ÇÖZÜLDÜ:

Cevabın sadece url_to_postid'i şu şekilde kullanmak olduğu ortaya çıktı:

$keyword = get_post_meta(
     url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ),
     '_wpg_def_keyword',
     true
);

Başlangıçta bile mükemmel çalışır.


1
bir eylem kancasına ihtiyacınız var, bir filtre kancasına değil, aynı zamanda kapsamda olmak initiçin çok erken global $post;. belki ne yapmaya çalıştığınızı açıklarsanız daha iyi yardımcı olabilirsiniz.
Bainternet

eylem kanca aynı şekilde davranır, her ikisini de denedim. Init çok erken olduğunu biliyorum, ben ihtiyacım olan sonuca ulaşmak için nasıl anlamaya çalışıyorum - hangi init çalışan almak için $ post-ID gerektiren DB bilgi alma çalışan bir filtre.
Jonathan

Gerçekten Do ihtiyaç init bunu yapmak? Neden daha sonra takılmıyorsunuz?
Rarst

URL’de zaten bir tane belirtilmemişse, sayfa için varsayılan anahtar kelimeyi almam gerekir. Bu anahtar kelime DB'de depolanır ve komut dosyasının geri kalanından herhangi biri yürütülmeden önce bilinmelidir. Sağladığım örnekte gördüğünüz gibi, sadece the_content'te ihtiyacım olan değeri elde edebiliyorum, ama sonra ekrana yankı yapıyor ve arama işlevine geri dönmüyor. Başka bir çözümünüz varsa, lütfen önerin.
Jonathan

Lütfen çözümünüzü bir cevaba taşıyın, sitenin mekaniği ile daha uyumlu olacaktır. Ayrıca başlığında çözülmesine gerek yok - cevabı kabul edebileceksiniz ve sorunuz cevaplanmış olarak işaretlenecektir.
Rarst

Yanıtlar:


12

Cevabın basitçe url_to_postidböyle kullanmak olduğu ortaya çıktı:

$keyword = get_post_meta( url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ), '_wpg_def_keyword', true );

Hatta mükemmel çalışır init.


2

Bu, WordPress 4.7'de de çalışır:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 

2

Bağlantı noktaları ve çok bölgeli bağlantı noktalarıyla çalışmadığından , kabul edilen yanıtı kullanmada sorun yaşadı . İşte her durumda çalışması gereken bir çözüm:

/**
* Note: This function will only work on SINGULAR posts/pages/post types
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// demo
add_action('init','my_super_early_meta_action');

function my_super_early_meta_action() {
    $keyword = get_post_meta( get_early_postid(), '_wpg_def_keyword', true );
}
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.