Внедрить If-ElseIf-Else-EndIf с короткими кодами

У меня очень мало опыта работы с WordPress и PHP, поэтому я заранее извиняюсь за проблемы с синтаксисом.

Я хотел бы знать, можно ли реализовать логику If / Else в качестве коротких кодов. Что-то вроде:

[if] Version: IF [elseif] Version: ELSEIF [else] Version: ELSE [/if] // OR... [if] Version: IF [if branch="elseif"] Version: ELSEIF [if branch="else"] Version: ELSE [/if] 

Если вы хотите получить больше информации о том, почему я хотел бы сделать такую ​​идиотскую вещь, см. Ссылку на SO.

Разбирайте теги CFML в PHP

Solutions Collecting From Web of "Внедрить If-ElseIf-Else-EndIf с короткими кодами"

Взглянув на ваш SO-сообщение, увидев вывод CF-метки, то, увидев, что вы пытаетесь сделать здесь с помощью коротких кодов, как сказал Отто, станет бессвязным беспорядком.

Там уже есть плагины, которые позволяют вам писать PHP-логику среди вашего постсообщения, а следующие Разрешить PHP в сообщениях и страницах даст вам эту возможность в синтаксисе короткого кода формы;

 [php] if ( condition ) { //do something... } elseif ( condition ) { //do something... } else { //do something... } [/php] 

Просто.

Все, что находится между вашим [php] <-- --> [/php] является регулярным PHP. Не нужно писать собственные функции короткого кода, чтобы имитировать логику if / elseif / else . Это было бы пустой тратой времени, и почему это происходит потому, что самая большая проблема, с которой вы столкнетесь, не имеет ничего общего с синтаксисом if / elseif / else PHP, а скорее может анализировать и интерпретировать с помощью логики существующие CFTags, их предназначение, а затем перевести эту цель в ее физический эквивалент в PHP, который должен по-прежнему соответствовать API WordPress, особенно если какая-либо из этих функций зависит от рамки WordPress (?)

Взяв мой пример выше, он не пройдет задолго до того, как ваша логика исчерпает контроль (с точки зрения размера), и это не место для того, чтобы бросать кучу кода (в любом случае в редактор сообщений).

Что вы могли бы сделать, все еще используя ту же концепцию выше, это создавать функции, которые выполняют эквивалентные действия ваших CFTags и имеют эти функции, хранящиеся в вашем файле functions.php в вашей папке тем, а затем из одного и того же блока кода выше вы можете что-то сделать как;


   // shortcode с последующей ссылкой на вашу функцию

   [php] echo do_tag_condtional ();  [/ PHP]

   // пример функции, принимающей аргументы и т. д.  

   [php] echo cftag_feature ($ args = 'bla');  [/ PHP] 

   // если ваша функция возвращает свой вывод как эхо, тогда вам не нужно эхо в вашей записи

   [php] quick_tag ();  [/ PHP] 

Эти функции соответствуют методам, которые вы создали для выполнения определенных задач, только то, что ваш код теперь намного более управляем, если вам нужно вставить его среди вашего содержимого для публикации.

Это также означает, что вы можете контролировать функциональность ваших функций, внешних по отношению к вашим сообщениям, для повышения гибкости, если вам нужно расширить эти функции.

НО…

Если ваш опыт ограничен, как вы предполагали, сможете ли вы разбираться с CFTags, а затем превращать их в некоторую логику PHP, которую вы действительно можете использовать? Потому что, если нет, то вышеупомянутое не будет делать для вас ничего хорошего, пока вы не преодолеете этот камень преткновения.

Вот почему я должен согласиться с Отто, что вам лучше фильтровать ваш контентный крючок, но в качестве альтернативного предложения, если серьезное соответствие регулярных выражений будет сложным, я бы использовал SimpleHTMLDom Parser в ваших функциях как КЛАСС ХЕЛПЕРА, который будет позволяют вам перебирать HTML и выбирать элементы на основе тегов, извлекать содержимое, которое вам нужно, манипулировать им и передавать его на другом конце, когда фильтр the_content перемещается, и вы почти так же хороши, как золото …

Пример (очень грубый …)

 add_filter('the_content','cftag_parser'); function cftag_parser($content) { include('path/to/simple_html_dom.php'); $html = new simple_html_dom(); $html->load($content); //get an element $element = $html->find("<cf_taglinks></cf_taglinks>"); //modify it $element[1]->innertext .= " insert this text inbetween the above tags"; //output it $html->save(); return $content; } в add_filter('the_content','cftag_parser'); function cftag_parser($content) { include('path/to/simple_html_dom.php'); $html = new simple_html_dom(); $html->load($content); //get an element $element = $html->find("<cf_taglinks></cf_taglinks>"); //modify it $element[1]->innertext .= " insert this text inbetween the above tags"; //output it $html->save(); return $content; } 

Здесь также довольно приличный учебник,

http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/

Это даст вам дополнительную информацию о том, как вы можете использовать SimpleHTMLDom Parser, чтобы помочь вам разобрать ваш контент в качестве альтернативы или даже добавить какое-то соответствие регулярному выражению.

Пища для размышлений …

Нелегко, и в любом случае это было бы больно и бессвязно.

Вместо этого я рекомендую написать собственный собственный код парсера, чтобы обрабатывать ваши cf: пользовательские теги как есть, без преобразования их в любой другой формат или короткий код или что у вас есть. Вы можете использовать фильтры в файле__состоянии и (вздрагивать) regexp, чтобы находить свои коды и обрабатывать их соответствующим образом.

Ваш основной фильтр выглядит следующим образом:

 add_filter('the_content','my_filter'); function my_filter($content) { // do whatever you like to the $content here return $content; } 

Все, что он возвращает, заменяет содержимое. Кроме того, фильтры привязаны в WordPress, причем каждый получает выход из предыдущего. Поэтому, если у вас есть какие-то пользовательские теги CF: там, вы можете иметь фильтр для каждого из них (или набор из них) и изменить его только для соответствующей секции содержимого, к которой относится фильтр.

Это довольно легко сделать. Вот старый базовый элемент, который представляет собой только один файл, который выполняет только это:

https://plugins.svn.wordpress.org/if-shortcode/tags/0.2.1/plugin.php

 <?php /* Plugin Name: If Shortcode Author: geomagas Description: Provides an "if" shortcode to conditionally render content Text Domain: if-shortcode Version: 0.2.1 */ $if_shortcode_filter_prefix = 'evaluate_condition_'; $if_shortcode_block = NULL; add_shortcode( 'if', 'process_if_shortcode' ); function process_if_shortcode( $atts, $content ) { global $if_shortcode_filter_prefix; $false_strings = array( '0', '', 'false', 'null', 'no' ); $atts = normalize_empty_atts( $atts ); $result = FALSE; foreach ( $atts as $condition => $val ) { $mustbe = ! in_array( $val, $false_strings, TRUE ); // strict, or else emty atts don't work as expected $evaluate = apply_filters( "{$if_shortcode_filter_prefix}{$condition}", FALSE ); $result |= $evaluate == $mustbe; } global $if_shortcode_block; $save_block = $if_shortcode_block; $if_shortcode_block = array( 'result' => $result, 'else' => '', ); $then = do_shortcode( $content ); $else = $if_shortcode_block['else']; $if_shortcode_block = $save_block; return $result ? $then : $else; } add_shortcode( 'else', 'process_else_shortcode' ); function process_else_shortcode( $atts, $content ) { global $if_shortcode_block; if ( $if_shortcode_block && ! $if_shortcode_block['result'] ) { $if_shortcode_block['else'] .= do_shortcode( $content ); } return ''; } add_shortcode( 'eitherway', 'process_eitherway_shortcode' ); function process_eitherway_shortcode( $atts, $content ) { $content = do_shortcode( $content ); global $if_shortcode_block; if ( $if_shortcode_block ) { $if_shortcode_block['else'] .= $content; } return $content; } // add supported conditional tags add_action( 'init', 'if_shortcode_conditional_tags' ); function if_shortcode_conditional_tags() { $supported = array( 'is_single', 'is_singular', 'is_page', 'is_home', 'is_front_page', 'is_category', 'is_tag', 'is_tax', 'is_sticky', 'is_author', 'is_archive', 'is_year', 'is_month', 'is_day', 'is_time', 'is_feed', 'is_search', 'comments_open', 'pings_open', 'is_404', 'is_user_logged_in', 'is_super_admin', ); global $if_shortcode_filter_prefix; foreach ( $supported as $tag ) { add_filter( "{$if_shortcode_filter_prefix}{$tag}", $tag ); } } // normalize_empty_atts found here: http://wordpress.stackexchange.com/a/123073/39275 function normalize_empty_atts( $atts ) { foreach ( $atts as $attribute => $value ) { if ( is_int( $attribute ) ) { $atts[ strtolower( $value ) ] = TRUE; unset( $atts[ $attribute ] ); } } return $atts; }