問題描述
讓我說我有一個主題選項或自定義 postmeta 文字區域。現在我要執行多個短碼,一般文字,影像等
什麼是最佳實踐,為什麼?
選項 1:
$content = //my text area data;
echo apply_filters('the_content', $content);
選項二:
$content = //my text area data;
echo do_shortcode($content);
請說明哪一個是最佳實踐,為什麼。
編輯
讓我詳細描述這種情況。我根據自己的要求為客戶開發主題。有時,我需要在 post /pages /custom post 型別中新增 post meta,這樣他們可以新增短節數 (滑塊,聯絡表單等) 或者只是一個簡單的文字。這是一個文字檔案。
為了使短碼工作,我使用選項 1. 現在,我聽到有人說這是一個錯誤的方式,我應該使用 do_shortcode 。但是他們沒有給我解釋為什麼這是錯誤的方式。這就是為什麼我問。
這個整個過程可以在 wp 的預設文字編輯器中完成。但是,我需要為模板特定的使用建立這些選項,這就是我的客戶想要的。
最佳解決方案
問題和答案修改
有時候,這些問題有時候會讓你失望,再次在生活中追捕你,這就是一個這樣的問題。
這個問題讓我想到了解決這個問題的另一種解決方案。正如我已經說過的那樣,自定義欄位和元框儲存小資料後設資料,而不是作為擴充套件內容的擴充套件,您可以在其中執行短程式碼和函式。另外,正如我已經說過的,你的方法不正確,不應該使用
我發現在您的帖子中發現有趣的是,您使用自定義欄位和元框無意中顯示使用者輸入中的自定義內容。所以我坐下來思考一個可能的方式來做這個工作,並正確地使用自定義的欄位資料和元框資料
這是我的想法:
場景:
注意:可以根據需要進行修改
在單個帖子上,使用者希望/要求在帖子後動態顯示自定義內容以滿足他的需要。這應該是動態的。內容應該是一個自定義查詢,使用者需要選擇什麼,他想要什麼,他想要什麼
可能的解決方案:
簡訊碼在這裡不起作用,因為在自定義欄位中不能執行短碼。 do_shortcode 也不會工作,因為它不是動態的,是硬編碼的,我們不想要的。在您的問題中,我們將使用自定義欄位。再次強調,不要使用自定義欄位來執行自定義查詢或縮寫
計劃:
我們將使用自定義欄位來僅儲存我們的查詢引數,即全部。那麼我們所做的就是建立一個名為 custom_query_arguments 的自定義欄位。在您的帖子編輯器螢幕中,您將看到您的自定義欄位,隨時可以使用
下一步是將我們的自定義查詢引數新增到我們的欄位中。讓我們說,我們需要顯示 3 個標題排序的帖子。所以我們的查詢引數應該如下所示:(以字串格式)
'posts_per_page=3&cat=1&orderby=title'
這是您現在應該在自定義欄位中輸入的內容。輸入後,儲存自定義欄位的值
接下來將在您的 single.php 中構建自定義查詢。這裡需要什麼,我們需要從我們的自定義欄位獲取值,這實際上是我們的查詢引數,並將其提供給 WP_Query 的新例項來檢索帖子。我們還需要檢查,如果自定義欄位為空,我們實際上是否儲存在該自定義欄位中的值,不顯示任何內容
程式碼:
在單個帖子之後,你可以在 single.php 中嘗試這樣的東西。
$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// check if the custom field has a value
if( ! empty( $args ) ) {
$q = new WP_Query( $args );
if( $q->have_posts() ) {
while( $q->have_posts() ) {
$q->the_post();
the_title();
}
wp_reset_postdata();
}
}
如果使用者想要刪除自定義查詢,他可以簡單地刪除自定義欄位的值,並將自定義欄位留空。如果他需要顯示相同的查詢,但是從第 10 類和總共 5 個帖子,他可以用以下替換原始值
'posts_per_page=5&cat=10&orderby=title'
請注意:
在此自定義欄位和元框中輸入資訊時,使用正確的 synatx 和格式非常重要。語法錯誤或不正確的資訊將導致不希望的輸出甚至致命的錯誤。讓客戶知道這些資訊很重要
原始答案
我不明白你正在試圖完成什麼,但是從我可以告訴你的那些,這是兩件事情
選項 1
apply_filters('the_content', $content); 用於將內容過濾器應用於原始未過濾的帖子內容,通常來自使用 $post->post_content 。這些過濾器包括著名的過濾器 wp_autop,它將 P 標籤新增到 the_content()
apply_filters('the_content', $content); 通常與 get_posts 結合使用,其中可直接與 WP_Post 物件一起使用,而不使用 setup_postdata( $post ),使得可以使用 the_content()等模板標籤
選項 2
do_shortcode 用於在頁面編輯器螢幕後端的文字編輯器外部的模板檔案的任何位置新增一個短碼,基本上透過鉤子來過濾短碼。
正確的用法如下
示例:將相簿短程式碼新增到模板檔案中
echo do_shortcode( '' )
編輯 1
從你的意見,我不會使用一個短碼。
如果您不透過文字編輯器新增一個短碼,並直接透過 do_shortcode 在模板檔案中新增它 (硬編碼),那麼我寧願將該功能新增到模板中
例:
如果您有以下短程式碼功能
function footag_func( $atts ) {
return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );
您可以直接在模板中直接呼叫函式
echo footag_func();
它的速度要快得多,因為短碼不需要解析
編輯 2
說實話,你從編輯中完全錯了。這就是為什麼我不明白你的初步問題
Sometimes, I need to add post meta on post/pages/custom post types, so that they can add shortcodes (slider, contact form etc) or just a simple text. It’s a text filed.
To make the shortcode working, I use option 1…..
Custom fields 不是文字欄位,肯定不是用於執行快捷鍵和滑塊或聯絡表單。不應該使用自定義欄位來替換文章和頁面中的文字編輯器。
如前所述,apply_filters('the_content', $content); 旨在用於將原始帖子內容應用於格式。
你有兩個選擇
-
使用
do_shortcode直接在模板檔案中,我不建議使用該功能更快,因為短程式碼不需要解析 -
在文字編輯器中直接使用短程式碼進行特定的頁面/帖子
我會認真地建議您重新整理您的結構以及您想要實現的目標。自定義欄位不是文字編輯器,不能執行縮寫或滑塊。
我的建議是看看可能是自定義小工具或可以與自定義欄位一起使用的系統
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。