Créer un shortcode sur Wordpress sans base PHP

Bonjour,

J’ai un site Wordpress avec un blogue et un site Discourse avec un forum. Dans la page de recherche de mon site wordpress, je veux avoir une section qui donnent aussi les résultats de mon forum Discourse, en plus de ceux de mon blogue.

J’ai trouvé cette façon de faire :

1- Créer un fichier php avec ce code et le mettre dans mon serveur

<?php

define('WP_USE_THEMES', false);
require_once('./wp-blog-header.php');

if (isset($_GET['s'])) {
    $search_term = str_replace('+',' ',$_GET['s']);
    $search_term = str_replace('\"','"',$_GET['s']);
}else{
    exit;
}

// change this to your forum's info
$api_key="YOURAPIKEY";
$api_user="system";
$url_base="https://www.yourforum.com/";
$api_auth="api_key=" . $api_key . "&api_username=" . $api_user;

$ch = curl_init();
$url = $url_base . "search/query.json?term=".urlencode($search_term)."&" . $api_auth;

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

$response = curl_exec($ch);	

$response_data = json_decode($response, true);

if ( !isset($response_data['errors']) )	{
	
	$all_posts = $response_data['posts'];
	$all_topics = $response_data['topics'];
	
	$num_results = count($all_posts);
	
	if ( $num_results > 0 )
		echo '<h3>Forum Discussions</h3>';

	for ( $i=0; $i<$num_results; $i++ ) {
		
		// see here for all the fields that can be parsed from the search results http://docs.discourse.org/#tag/Search
		$topic_title = $all_topics[$i]['title'];
		$result_url = $url_base . 't/' . $all_topics[$i]['slug'] . '/' . $all_posts[$i]['topic_id'] . '/' . $all_posts[$i]['post_number'];
		$blurb = str_ireplace($search_term,'<b>'.$search_term.'</b>',$all_posts[$i]['blurb']);
		$username = $all_posts[$i]['username'];
		$avatar = $url_base . str_replace('{size}','30',$all_posts[$i]['avatar_template']);
		echo '<p><a target="_new" href="'.$url_base.'u/'.$username.'/summary"><img src="'.$avatar.'" align="left"></a><a target="_new" href="'.$result_url.'">' . $topic_title . '</a>' . '</p><p>' . $blurb . '</p>';
		
	}
	
	echo '<p><a target="_new" href="'.$url_base.'search?q='.$search_term.'">See all forum discussions about: '.$search_term.'</a></p>';
}
?>

2- Ajouter ce code dans le fichier search.php de mon THÈME wordpress.

<iframe src="./discoursesearch.php?s=<?php echo urlencode(get_search_query());?>" height="1000" width="100%" style="height:1000px;width:100%;"></iframe>

C’est fait et ça marche. Sauf que je veux modifier le visuel de ma page de recherche avec mon page builder (ElementorPro). Quand je travaille avec cet éditeur, ça prend pas en compte les modifications que j’ai fait sur la page de recherche du thème.

Alors on m’a dit de créer un shortcode pour le mettre dans mon page builder.

Quelqu’un peut m’aider? Merci!

Salut François,
Tu dois préalablement avoir un thème enfant (child theme), sinon ta programmation sera perdue à la prochaine mise à jour de ton thème.

Dans le dossier de ton thème enfant, tu as un fichier functions.php. Ajoute dedans ton code sous ce format:

function custom_search_shortcode() {
  // Your code here
}
add_shortcode( 'custom_search', 'custom_search_shortcode' );

Tu pourras ensuite utiliser [custom_search] dans n’importe quelle page et cela exécutera le code respectif. Cela ne te permettra pas de modifier le contenu du shortcode avec ton éditeur, mais le reste de la page sera modifiable.

PS: Il est possible que tes deux premières lignes doivent être en dehors du shortcode.
Let us know how it goes.

1 « J'aime »

Merci Vincent pour ton temps!

J’ai créer le child theme et j’ai insérer le code (au point 1) dans functions.php. Et ça marche pas en mettant les deux lignes dedans le shortcode.

define('WP_USE_THEMES', false);
require_once('./wp-blog-header.php');

Et en dehors, ça me donne cet erreur là

Est-ce que le fichier wp-blog-header.php est est dans le dossier du child theme avec le fichier functions.php?

Oui je l’ai trouvé et je l’ai mis. J’ai encore le message d’erreur.

57

Mon code dans functions.php ressemble à ça :

<?php
// Exit if accessed directly
if ( !defined( 'ABSPATH' ) ) exit;

// BEGIN ENQUEUE PARENT ACTION
// AUTO GENERATED - Do not modify or remove comment markers above or below:

// END ENQUEUE PARENT ACTION

function custom_search_shortcode() {
	
define('WP_USE_THEMES', false);
require_once('./wp-blog-header.php');
	
if (isset($_GET['s'])) {
    $search_term = str_replace('+',' ',$_GET['s']);
    $search_term = str_replace('\"','"',$_GET['s']);
}else{
    exit;
}

// change this to your forum's info
$api_key="my_api_key";
$api_user="system";
$url_base="https://forum.lepeuplier.ca/";
$api_auth="api_key=" . $api_key . "&api_username=" . $api_user;

$ch = curl_init();
$url = $url_base . "search/query.json?term=".urlencode($search_term)."&" . $api_auth;

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

$response = curl_exec($ch);	

$response_data = json_decode($response, true);

if ( !isset($response_data['errors']) )	{
	
	$all_posts = $response_data['posts'];
	$all_topics = $response_data['topics'];
	
	$num_results = count($all_posts);
	
	if ( $num_results > 0 )
		echo '<h3>Forum Discussions</h3>';

	for ( $i=0; $i<$num_results; $i++ ) {
		
		// see here for all the fields that can be parsed from the search results http://docs.discourse.org/#tag/Search
		$topic_title = $all_topics[$i]['title'];
		$result_url = $url_base . 't/' . $all_topics[$i]['slug'] . '/' . $all_posts[$i]['topic_id'] . '/' . $all_posts[$i]['post_number'];
		$blurb = str_ireplace($search_term,'<b>'.$search_term.'</b>',$all_posts[$i]['blurb']);
		$username = $all_posts[$i]['username'];
		$avatar = $url_base . str_replace('{size}','30',$all_posts[$i]['avatar_template']);
		echo '<p><a target="_new" href="'.$url_base.'u/'.$username.'/summary"><img src="'.$avatar.'" align="left"></a><a target="_new" href="'.$result_url.'">' . $topic_title . '</a>' . '</p><p>' . $blurb . '</p>';
		
	}
	
	echo '<p><a target="_new" href="'.$url_base.'search?q='.$search_term.'">See all forum discussions about: '.$search_term.'</a></p>';
}
}
add_shortcode( 'custom_search', 'custom_search_shortcode' );

C’est un peu du essais et erreur vu que c’est du custom.
Tu peux essayer de changer require_once('./wp-blog-header.php'); par require_once('/wp-blog-header.php'); si ton fichier wp-blog-header.php est à la racine de ton site Web.

Ça ne fonctionne toujours pas :frowning:

En fait, ma page de recherche qui a été modifié avec Elementor et où j’ai mis le shortcode [custom_search] n’affiche plus correctement. C’est seulement une page blanche avec : 10

Salut François,
Il faudrait avoir accès à ton code pour t’aider de manière efficace. Je ne sais pas si tu as un développeur Web que tu connais ou si quelqu’un de La Tranchée se porte volontaire.

Selon moi, il faut probablement garder le code à part (dans son propre fichier PHP) et seulement “shortcoder” le iframe que tu as mentionné précédemment.

Notre équipe pourrait t’aider, mais il y aurait un frais pour l’exécution.

Oui c’est ce que j’avais fait au début, j’ai créer un fichier discoursesearch.php que j’ai mis dans mon serveur.

Je croyais qu’il fallait mettre le gros code dans le shortcode, mais c’est seulement le iframe?

Ça ressemble à ça?

function custom_search_shortcode() {
<iframe src="./discoursesearch.php?s=<?php echo urlencode(get_search_query());?>" height="1000" width="100%" style="height:1000px;width:100%;"></iframe>
}
add_shortcode( 'custom_search', 'custom_search_shortcode' );

J’ai essayé et il y a une erreur à cause du symbole <

Non :frowning: c’est pour ça que j’ai demandé de l’aide ici…

L’erreur vient du shortcode.
Essai plutôt:

function custom_search_shortcode() {
echo '<iframe src="./discoursesearch.php?s=' . urlencode(get_search_query()) . '" height="1000" width="100%" style="height:1000px;width:100%;"></iframe>';
}
add_shortcode( 'custom_search', 'custom_search_shortcode' );

Si ça ne fonctionne pas et que tu n’as pas d’erreur, appuies sur F12 pour regarder la console. Ce sera probablement le chemin vers le fichier discoursesearch.php qui sera à ajuster.