Personalising Wordpress Sessions Based on the Visited URLs - php

first time Question asker here. I'm building a web page and want to change the text on page if the user has visited certain pages.
My initial idea was too create an array in the session which records each url as its visited with something like $_SERVER['REQUEST_URI'], which would probably work if it was a site I was building from scratch. however... Because the site is built in Wordpress I'm not 100% how to go about doing that within there system.

Now here's what I'd suggest you do. Navigate to your Theme and open the file functions.php
Then find a suitable spot anywhere on the File (The bottom of the file wouldn't be that odd).
Then, add the following functions:
<?php
// FILE-NAME: functions.php <== LOCATED AT THE ___/wp-content/themes/your-theme-name
add_action("init", "initiatePageLogging");
function initiatePageLogging(){
// START THE SESSION IF IT HAS NOT BEEN STARTED
// THIS WOULD BE USED TO SHARE DATA ACROSS YOUR PAGES...
if (session_status() == PHP_SESSION_NONE || session_id() == '') {
session_start();
}
// CHECK THAT THE SESSION VARIABLE FOR OUR PAGE-LOGGING IS THERE
// IF NOT CREATE IT
if(!isset($_SESSION['visitedPages'])){
// IT DOES NOT EXIST SO WE CREATE IT & INITIALIZE IT AS AN EMPTY ARRAY
$_SESSION['visitedPages'] = array();
}
// NO NEED TO KEEP THE SESSION ARRAY $_SESSION['visitedPages'] TOO LONG
// SO WE TRIM IT OUT CONDITIONALLY TO KEEP IT UNDER CHECK
if(count($_SESSION['visitedPages']) >= 10){
// WE REMOVE ABOUT 7 ELEMENTS FROM THE BEGINNING OF THE ARRAY
// LEAVING JUST THE LAST 3 - NOW THAT'S COOL...
$arrVisitedPages = $_SESSION['visitedPages'];
array_splice($arrVisitedPages, 0, 7);
// RE-DEFINE THE $_SESSION['visitedPages'] ARRAY
$_SESSION['visitedPages'] = $arrVisitedPages;
}
}
function getLastVisitedPage(){
$lastVisitedPage = get_site_url() . $_SERVER['REQUEST_URI']; //<== FALL BACK TO THE CURRENT PAGE IF WE HAVE AN ISSUE.
if( isset($_SESSION['visitedPages']) && is_array($_SESSION['visitedPages']) ){
$arrVP = $_SESSION['visitedPages'];
$intArrVPLength = count($arrVP);
$diff = ($intArrVPLength - 2);
$lastVisitedPage = ( $intArrVPLength > 1) ? $arrVP[$diff] : $lastVisitedPage;
}
return $lastVisitedPage;
}
?>
Now, Part 1 is done! Inside of your Theme, You will still find a File Called header.php
This is where we have to do the logging because by default every page in Word-Press loads this Page (except when configured otherwise).
At the very, very top of that File - I mean on Line 1, do this:
<?php
// FILE-NAME: header.php <== LOCATED AT THE ___/wp-content/themes/your-theme-name
// BUILD THE URL OF THE CURRENT PAGE & PUSH IT TO THE SESSION VARIABLE...
$thisPage = get_site_url() . $_SERVER['REQUEST_URI'];
$_SESSION['visitedPages'][] = $thisPage;
// THAT'S ALL! BELOW HERE, THE ORIGINAL CONTENT OF THE header.php FILE CONTINUES...
?>
One more thing! How do we now use the $_SESSION['visitedPages'] Variable?
Otherwise, how do we know which page was last visited using the $_SESSION['visitedPages'] Variable?
Now on every File like (page.php, index.php, category.php, taxonomy.php, etc); you can now find out the last visited Page by doing something like this:
<?php
// FILE-NAME: ANY FILE IN THE THEME LIKE: page.php, index.php, category.php, taxonomy.php, etc
$lastVisitedPage = getLastVisitedPage();
// THAT'S IT, PAL...
?>
I hope this helps....

Related

Show/hide page content based on cookie from url parameter

I am looking to show some content on a page based on the parameter in a link.
If a link is given to a user https://www.examplesite.com/example-page/?client_feeback=1
then they will see the content of the page, if not using the link, then users will not see the content.
Additionally, I need the users of the link to be able to look on other pages and return to the page where the content is hidden/shown and still see the content.
I have set a cookie in functions.php, that will expire in 30days.
code added into functions.php
add_action('init', 'set_feedback_cookie');
function set_feedback_cookie () {
$name = 'client_feedback';
$value= 1;
setcookie($name, $value, strtotime( '+30 days' ), "/example-page/", "examplesite.com", "true" );
}
I have then added the following into the example-page.php template file
<?php
if (!isset($_GET['client_feedback'])) { ?>
<style type="text/css">#form__feedback {display:none!important}</style>
<?php } else { ?>
<style type="text/css">#form__feedback {display:block!important}</style>
<?php } ?>
The cookie is loaded on to the site and the content is hidden/shown when using/ not-using the url link.
What is not working, is the ability to browse other pages on the site and come back to the page with the hidden content and still see it!
Since you confirmed in the comment section that you are not leaving your own domain, You could put the GET variable into a SESSION variable and do your checks based on that. That way, you will always have that available to you until the user leaves the site or you manually kill the session somewhere.
Example:
<?php
session_start();
$_SESSION["client_feedback"] = $_GET['client_feedback'];
?>
As long as declare your session_start(); at the very beginning of your page(s) (literally before ANYTHING else), you can access your session variable anywhere you want.
Now you can perform checks on your session variable with the logic you're trying to achieve in order to display your desired content.
Full Example:
<?php
session_start();
if($_GET['client_feedback'] != "") {
$_SESSION["client_feedback"] = $_GET['client_feedback'];
}
if( isset( $_SESSION["client_feedback"] ) != "" ) {
?> <style type="text/css">#form__feedback {display:block!important}</style> <?php
} else {
?> <style type="text/css">#form__feedback {display:none!important}</style> <?php
}
?>
You can read more about PHP sessions here.

random(non- repeating) file generator on click of button in php

i want to display 5 php files content randomly but non repeating when clicked a button [NEXT] using php/javascript (that works in php desktop as well).
the code i used did displayed random web page on page load but i did came across repeated web page
this is the code i used for index.php file:
<?php
$RandomList = array();
$RandomList[] = "/review/review-a1.php";
$RandomList[] = "/review/review-a2.php";
$RandomList[] = "/review/review-a3.php";
$RandomList[] = "/review/review-a4.php";
readfile($_SERVER['DOCUMENT_ROOT'].$RandomList[rand(0,count($RandomList)-1)]);
?>
please suggest how to get non repeated files .
Just save paths you already used in the session:
//Read visited paths from session or create a new list.
//?? works only in PHP7+. Use isset()?: instead of ?? for previous versions
$visitedPaths = $_SESSION['visitedPaths'] ?? [];
//Your list, just slightly changed syntax. Same thing
$randomList = [
"/review/review-a1.php",
"/review/review-a2.php",
"/review/review-a3.php",
"/review/review-a4.php"
];
//Remove all paths that were already visited from the randomList
$randomList = array_diff($randomList, $visitedPaths);
//You need to check now if there are paths left
if (!empty($randomList)) {
//The user did not load all files, so we can show him the next one
//Use array_rand() rather than $array[rand(0, count($array) -1)]
$randomPath = $randomList[array_rand($randomList)];
readfile($_SERVER['DOCUMENT_ROOT'] . $randomPath);
//Now we need to save, that the user loaded this file
$visitedPaths[] = $randomPath;
//And we need to save the new list in the session
$_SESSION['visitedPaths'] = $visitedPaths;
} else {
//TODO: Add some logic in case all paths have been visited
}

Why this cookie-set code not work via smarty but does with 'direct' php

The core of this question is to ascertain why the same code, when enclosed by {php} tags in a smarty template - doesn't work fully, compared to when the 'same code' is contained in tags (in a non-smarty template). Specifically, the smarty code version (though partly functioning) isn't returning users to their original landing page.
More info: Am utilising a script which provides a smarty template framework for customisation. On other 'pure php' template sites I've been utilising the following code for the gateway page and all other pages respectively. Part of the functionality of the code is that after being first directed to the gateway page (if they don't have relevant cookie set), users (after getting a cookie) are then redirected back to the page they originally landed on.
[Because so similar, will just include the smarty version. Only difference are the opening and closing tags.]
Code on all pages except gateway page:
{php}
session_start();
function check_if_spider()
{
$spiders = array('Googlebot','google','Yammybot','Openbot','Yahoo','Slurp','msnbot', 'ia_archiver','Lycos',
'Scooter','AltaVista','Teoma','Gigabot','Googlebot-Mobile','Baiduspider','R6_FeedFetcher','NetcraftSurveyAgent',
'Sogou web spider','bingbot','facebookexternalhit','PrintfulBot','msnbot','Twitterbot','UnwindFetchor','urlresolver','Butterfly', 'TweetmemeBot', 'ia_archiver');
// Loop through each spider and check if it appears in
// the User Agent
foreach ($spiders as $spider)
{
if (stristr($_SERVER['HTTP_USER_AGENT'],$spider) == true)
return TRUE;
}
return FALSE;
}
if (check_if_spider() == false) {
if (empty($_COOKIE["accepted"])) {
$_SESSION["page_address"] = $_SERVER["PHP_SELF"];
header("Location: http://www.domain.name/gateway.shtml");
exit;
}
}
{/php}
This is code on gateway page (actually, this is a non-smarty generated php page, so normal php tags used)
<?php
$inoneday = $_SESSION['inoneday'];
if (empty($inoneday)) $inoneday = '';
$baseaddress = $_SESSION['baseaddress'];
if (empty($baseaddress)) $baseaddress = '';
$page_address = $_SESSION['page_address'];
if (empty($page_address)) $page_address = '';
session_start();
//Expire 25 days in the future
//seconds * minutes * hours * days + current time
$inoneday = 60 * 60 * 24 * 25 + time();
setcookie('accepted', date("G:i - m/d/y"), $inoneday);
if ($_SESSION["page_address"] != NULL) {
$baseaddress = "http://www.domain.name";
header('Location: '.$baseaddress . $_SESSION['page_address']);
exit; }
else {
header("Location: http://www.domain.name/index.php");
exit; }
?>
When a user lands on one of the site pages, they are correctly redirected back to the gateway page - just that after the gateway page, they are always directed back to: http://www.domain.name/index.php and not their original landing position. Thus it seems that these lines in the smarty template are not working, or transferring info:
$_SESSION["page_address"] = $_SERVER["PHP_SELF"];
and that
if ($_SESSION["page_address"]
is always equalling null.
Why is this and what can I do to fix it.

Display pages on index?action=

I would like to open a page using index.php?do=settings,
I'm using following code:
$do='';
if (isset($_GET['do'])){
$do = strip_tags($_GET['action']);
}
if ($do == 'settings') {
header("location:settings.php");
}
if ($do == 'posts') {
header("location:posts.php");
}
but the problem is that I have manually add all menu in actions like above to make it work and when it redirects me, the index.php?do=settings disappears and just show me settings.php which I do not want
To avoid having to set it manually you can store the pages in an array with the keys as the page name and the value as the file and then include the file:
$pages = array(
'settings' => 'settings.php',
'otherpage' => 'somePage.php'
);
if (isset($pages[$do])) {
include $pages[$do];
}
You should include the file as the reason the URL changes is because of the redirect.
add the get var back in like so
header("location: http://yoursite.com/settings.php?do=".$do);
NB: that should be the full uri not a relative one
You can use http_build_query($_GET) to generate the query string for links that need to conserve GET data.
If you need to modify a GET key, save GET to a temp array, modify that and pass it to http_build_query.

How do I redirect to referring page/url after successful login?

I'm aware that this topic has been covered before here on Stack, and I have looked at some answers, but I'm still a bit stuck, being fairly new to PHP. Every page on my website requires a login, and so users are redirected to a login page on page load. At the top of each page then I have:
<?
require("log.php");
include_once("config.php");
include_once("functions.php");
?>
This redirects the user to log.php (with new code added):
<?
session_name("MyLogin");
session_start();
if(isset($_SESSION['url']))
$url = $_SESSION['url']; // holds url for last page visited.
else
$url = "index.php"; // default page for
if($_GET['action'] == "login") {
$conn = mysql_connect("localhost","",""); // your MySQL connection data
$db = mysql_select_db(""); //put your database name in here
$name = $_POST['user'];
$q_user = mysql_query("SELECT * FROM users WHERE login='$name'");
if (!$q_user) {
die(mysql_error());
}
if(mysql_num_rows($q_user) == 1) {
$query = mysql_query("SELECT * FROM users WHERE login='$name'");
$data = mysql_fetch_array($query);
if($_POST['pwd'] == $data['password']) {
$_SESSION["name"] = $name;
header("Location: http://monthlymixup.com/$url"); // success page. put the URL you want
exit;
} else {
header("Location: login.php?login=failed&cause=".urlencode('Wrong Password'));
exit;
}
} else {
header("Location: login.php?login=failed&cause=".urlencode('Invalid User'));
exit;
}
}
// if the session is not registered
if(session_is_registered("name") == false) {
header("Location: login.php");
}
?>
The login form is contained in login.php. The code for login.pho relevant to the PHP/log.php is:
<?
session_start();
if($_GET['login'] == "failed") {
print $_GET['cause'];
}
?>
and
<form name="login_form" id="form" method="post" action="log.php?action=login">
The answer that I came across stated that I should add:
session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];
to the top of each page, which I did, at the top of the page (above "require("log.php");"), and then add:
if(isset($_SESSION['url']))
$url = $_SESSION['url']; // holds url for last page visited.
else
$url = "index.php"; // default page for
to my login page, and use the following URL for redirect on successful login:
header("Location: http://example.com/$url"); // perform correct redirect.
I am not 100% where the code which stores the referring URL should go, at the top of log.php or login.php.
I have tried adding it to both, but the login page is just looping once I have entered the username and password.
I wonder if someone could help me get this working?
Thanks,
Nick
It appears that I don't have the privilege to comment on your post, so I'll do the best that I can to answer. I apologize for all of the scenarios, I'm just doing the best I can to answer on a whim.
SCENARIO 1:
If you've truly not selected a database in your code, as demonstrated here, could that potentially be your issue? Please do note, that the code below, is the code you've posted.
$db = mysql_select_db(""); //put your database name in here
SCENARIO 2:
The code below is not something I've ever used in anything I've built, might I suggest that you try replacing that line of code with the line below it?
if(session_is_registered("name") == false) { // Current
if(isset($_SESSION['name']) == false) { // Potential Replacement
SCENARIO 3:
If you're logic for the following, exists on the login.php file as well... That could potentially be your problem. Upon visiting your site, I noticed your form appears on login.php, yet your logic is posting to log.php. I'm hoping this bit of code can help rule out that "jump", as login.php might be saving itself and overwriting the $_SESSION variable you've established
session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];
If it's too complex to take it out of the login.php file, if you even have it there, I've put together some code that you can use to create "internal" breadcrumbs, so you can go 2 pages back in your history.
if(!isset($_SESSION['internal_breadcrumbs']))
$_SESSION['internal_breadcrumbs'] = array();
$_SESSION['internal_breadcrumbs'][] = $_SERVER['REQUEST_URI'];
$max_breadcrumbs = 5;
while(count($_SESSION['internal_breadcrumbs']) > $max_breadcrumbs)
array_shift($_SESSION['internal_breadcrumbs']);
That will create an array with a max of $max_breadcrumbs elements, with your most recent page at the end, like the following
Array
(
[internal_breadcrumbs] => Array
(
[0] => /other_page.php
[1] => /other_page.php
[2] => /other_page.php
[3] => /user_page.php <-- desired page
[4] => /login.php <-- most recent page
)
)
So now... you can setup your url to be something more like the following...
// I'm doing - 2 to accommodate for zero indexing, to get 1 from the current page
if(isset($_SESSION['internal_breadcrumbs']))
$url = $_SESSION['internal_breadcrumbs'][count($_SESSION['internal_breadcrumbs']) - 2];
else
$url = "index.php"; // default page for
All the best, and I certainly hope this has helped in some way.
IN SCENARIO 4
From the client test the login/password which ajax XMLHttpRequest with javascript code to a dedicated script for validation (do it on mode https for secure)
If response is right send the login password to your script server.
Stips : Encoding password is better secure !
Using header() function it's a bad idea.
Manual specification say ;
Remember that header() must be called before any actual output is
sent, either by normal HTML tags, blank lines in a file, or from PHP.
It is a very common error to read code with include, or require,
functions, or another file access function, and have spaces or empty
lines that are output before header() is called. The same problem
exists when using a single PHP/HTML file.
So in your case, i suggest that to use cookies with an ID generate only for the session, at the first connection its generate, and the duration of the cookie maybe for only from 2 to 10 minutes.
Regenerate cookie each time the loging.PHP is called !
Have a nice day

Categories