web-dev-qa-db-ja.com

短いコードで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に関する言及されたポストを見てください。

PHPのCFMLタグを解析する /

2
Snekse

SO投稿を見て、CFタグの出力を見てから、ここでショートコードを使って何を試みようとしているのかを見るのは、矛盾する混乱になるでしょう。

あなたの投稿コンテンツの中にPHPロジックを書くことを可能にするプラグインが既に存在しています、そして次の Allow PHPで投稿とページ の形であなたにその能力を与えるでしょうこのような構文

[php]

    if ( condition ) {

        //do something...

    } elseif ( condition ) {

       //do something...

    } else {

       //do something...

    }

[/php]

簡単です。

[php] <-- --> [/php]の間にあるものはすべて通常のPHPです。if/elseif/elseロジックを模倣するために独自のショートコード関数を書く必要はありません。それは時間の浪費になるでしょう、そしてそれがあなたが直面する最大の問題はPHPのif/elseif/else構文とは何の関係もないからです。 _しかし、 logic を介して既存のCFTag、それらの意図された目的を解析し、解釈することができ、それからその目的をPHPの物理的同等物に変換できます。特に、その機能のいずれかがWordPressフレームワークに依存している場合は、WordPress APIに準拠する必要があります(?)。

上記の私の例を挙げると、(サイズの観点から)ロジックが制御不能になるまでそれほど時間はかかりません。(とにかくポストコンテンツエディタに)たくさんのコードを投入するのは現実的な場所ではありません。

上記と同じ概念を使用して、CFTagと同等のアクションを実行し、それらの関数をテーマフォルダーのfunctions.phpファイルに格納してから、上記の同じコードブロック内から実行できる関数を作成することができます。

 
 //ショートコードの後に​​関数を参照する
 
 [php] echo do_tag_condtional(); [/php]

 //引数などを受け入れる関数例
 
 [php] echo cftag_feature($ args = 'bla'); [/ php] 
 
 //関数がその出力をechoとして返す場合は、投稿内でエコーする必要はありません
 
 [php] quick_tag( ; [/ php] 
 

これらの関数は、特定のタスクを実行するために作成したメソッドに対応していますが、投稿コンテンツに挿入する必要がある場合にのみコードが管理しやすくなっています。

それはまたあなたがそれらの機能を拡張する必要がある場合に柔軟性を高めるためにあなたの投稿の機能の外部であなたの前記機能の機能を制御できることを意味します。

しかし...

あなたの経験があなたが示唆したように限られているならば、あなたはCFTagsを解析して、そしてそれをあなたが実際に使うことができるPHPロジックに変えることができるでしょうか?そうでなければ、あなたがそのつまずきブロックを克服するまで、前述のことはあなたのために素晴らしいことをするつもりはないので。

だからこそ、私はOttoにあなたのコンテンツフックをフィルタリングするほうがよいと同意しなければならないが、真剣な正規表現のマッチングが困難になる場合の代替案として、 SimpleHTMLDom Parser をあなたの関数として使うHELPER CLASSこれにより、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;
}

ここにはかなりまともなチュートリアルもあります。

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

これにより、SimpleHTMLDomパーサーを使用して、正規表現のマッチングの代替手段として、または追加として、コンテンツを解析するのに役立つ方法についての追加の洞察が得られます。

思考の糧...

2
userabuser

簡単ではありません、とにかくそれは痛みを伴うとインコヒーレント混乱だろう。

代わりに、私はあなたのcf:customタグをそのまま他のフォーマットやショートコードに変換することなしに扱うためにあなた自身のカスタムパーサーコードを書くことを勧めます。あなたは自分のコードを見つけてそれらを適切に処理するためにthe_contentと(shudder)regexpにフィルタを使うことができます。

あなたの基本的なフィルタはこのようになります:

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

それが返すものは何でもコンテンツを置き換えます。また、フィルタはWordPressにチェーンされ、それぞれが前の出力を受け取ります。そのため、カスタムのCF:タグがある場合は、それぞれにフィルタ(またはそれらのセット)を設定して、フィルタが関連する関連コンテンツセクションのみを変更して置き換えることができます。

1
Otto

かなり簡単にできます。これがこれを行う単一のファイルだけである古い基本です。

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;
}
1
sMyles