web-dev-qa-db-fra.com

Implémenter If-ElseIf-Else-EndIf avec des codes courts

J'ai très peu d'expérience avec WordPress et PHP, je m'excuse par avance pour les problèmes de syntaxe.

J'aimerais savoir s'il est possible d'implémenter la logique If/Else en tant que codes courts. Quelque chose comme:

[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]

Si vous souhaitez avoir plus d'informations sur les raisons pour lesquelles je voudrais faire une chose aussi idiote, consultez le post référencé sur SO.

Analyser les balises CFML dans PHP

2
Snekse

Regarder votre article SO, voir la sortie de la balise CF, puis voir ce que vous essayez d'essayer ici avec des codes abrégés est, comme Otto l'a dit, un désordre incohérent.

Il existe déjà des plug-ins qui vous permettent d'écrire PHP logique dans le contenu de votre message, et le message Autoriser PHP suivant dans les publications et les pages vous donnera cette possibilité sous la forme shortcode la syntaxe comme ceci;

[php]

    if ( condition ) {

        //do something...

    } elseif ( condition ) {

       //do something...

    } else {

       //do something...

    }

[/php]

Simple.

Tout ce qui se trouve entre votre [php] <-- --> [/php] est un PHP ordinaire. Pas besoin d'écrire vos propres fonctions de shortcode pour imiter la logiqueif/elseif/else. Ce serait une perte de temps et la raison en est que le plus gros problème que vous allez affronter n’a rien à voir avec la syntaxeif/elseif/else/ de PHP mais plutôt être capable d’analyser et d’interpréter via logic les CFTags existants, leur fonction prévue, puis de traduire cette fonction en son équivalent physique dans PHP dont doit encore se conformer à l'API WordPress, surtout si l'une de ces fonctionnalités dépend du framework WordPress (?)

En prenant mon exemple ci-dessus, il ne faudra pas longtemps avant que votre logique ne devienne incontrôlable (en termes de taille) et ce n'est pas un endroit idéal pour lancer un tas de code (dans votre éditeur de contenu de publication de toute façon).

Ce que vous pouvez faire, en utilisant toujours le même concept ci-dessus, est de créer des fonctions qui effectuent les actions équivalentes de vos balises CFTags. Ces fonctions sont stockées dans votre fichier functions.php dans votre dossier de thème, puis à partir du même bloc de code ci-dessus, vous pouvez effectuer les opérations suivantes:

 
 // shortcode suivi de la référence à votre fonction 
 
 [php] echo do_tag_condtional (); [/php]

 // exemple de fonction acceptant les arguments, etc. 
 
 [php] echo cftag_feature ($ args = 'bla'); [/ php] 
 
 // si votre fonction renvoie sa sortie sous forme d'écho, vous n'avez pas besoin d'écho dans votre message 
 
 [php] quick_tag ( ) [/ php] 
 

Ces fonctions correspondent aux méthodes que vous avez créées pour effectuer des tâches particulières. Toutefois, votre code est désormais beaucoup plus facile à gérer si vous devez l'insérer dans le contenu de votre message.

Cela signifie également que vous pouvez contrôler les fonctionnalités de vos fonctions dites externes à celles de vos messages pour une flexibilité accrue si vous avez besoin de développer ces fonctions.

MAIS...

Si votre expérience est limitée, comme vous l'avez suggéré, allez-vous être capable d'analyser les balises CFTags, puis de les transformer en une logique PHP que vous pouvez réellement utiliser? Parce que sinon, ce qui précède ne va pas faire un super pour vous jusqu'à ce que vous surmontiez cette pierre d'achoppement.

C’est pourquoi je suis d’accord avec Otto sur le fait que vous feriez mieux de filtrer votre crochet de contenu, mais comme suggestion alternative si la correspondance des expressions rationnelles sérieuse est trop difficile, j’utiliserais SimpleHTMLDom Parser dans vos fonctions en tant queHELPER CLASSqui vous permettra de parcourir le HTML et de sélectionner des éléments en fonction des balises, d’extraire le contenu dont vous avez besoin, de le manipuler et de le transmettre à l’autre extrémité à mesure que le filtre the_content avance et êtes presque aussi bon que l'or ...

Exemple (très brut ...)

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

Il y a aussi un bon tutoriel ici,

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

Ce qui vous donnera un aperçu supplémentaire sur la façon dont vous pouvez utiliser SimpleHTMLDom Parser pour vous aider à analyser votre contenu comme une alternative à, voire un ajout à certaines correspondances d'expressions régulières.

Nourriture pour la pensée...

2
userabuser

Pas facilement, et de toute façon, ce serait douloureux et un désordre incohérent.

Au lieu de cela, je vous recommande d’écrire votre propre code d’analyseur personnalisé pour gérer vos balises cf: custom sans les convertir en un autre format ou code court ou ce que vous avez. Vous pouvez utiliser des filtres sur the_content et une expression rationnelle (shudder) pour trouver vos codes et les traiter correctement.

Votre filtre de base ressemble à ceci:

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

Quoi qu'il retourne remplace le contenu. En outre, les filtres sont chaînés dans WordPress, chacun recevant la sortie du précédent. Ainsi, si vous avez des balises CF: personnalisées, vous pouvez avoir un filtre pour chaque balise (ou un ensemble d'entre elles) et le modifier et remplacer uniquement la section de contenu pertinente à laquelle appartient le filtre.

1
Otto

C'est possible assez facile à faire. Voici une ancienne base qui n’est qu’un seul fichier qui ne fait que cela:

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