• 0

WordPress export list of pages in to an array.


Question

I am trying to export a list of pages from the database as an array for WordPress. This is to generate a dropdown menu of the pages from the database.

I'm a little stuck as this part of WordPress is new to me and I need a little help from any one who has had experience in creating something similar to this function.

This is my function:

function fetch_redirect_page(){
	global $wpdb;
	$pages = $wpdb->get_results("SELECT post_title, post_status, post_type FROM $wpdb->posts WHERE `post_status`='publish' AND `post_type`='page'");
	$redirect = "";
	foreach($pages as $page){
		$redirect .= '"'.$page->post_title.'"';
	}
	$redirect = array($redirect);
	return $redirect;
}

to which goes into the options section of this array.

array(
	"name" => "Redirect To",
	"desc" => "This will redirect the user to the page selected after the user has left a comment.",
	"id" => "commentredirect",
	"type" => "select",
	"options" => fetch_redirect_page(),
	"std" => ""
),

This is my html export results so far:

<label for="commentredirect">Redirect To</label>
<select name="commentredirect" id="commentredirect">
<option value="" about="" home="" blog="" contact="">"About""Home""Blog""Contact"</option>
</select>
<small>This will redirect the user to the page selected after the user has left a comment.</small>

which is completely wrong and will not work at all.

I need it to export like so:

<label for="commentredirect">Redirect To</label>
<select name="commentredirect" id="commentredirect">
<option value="about">About</option>
<option value="blog">Blog</option>
<option value="contact">Contact</option>
<option value="home">Home</option>
</select>
<small>This will redirect the user to the page selected after the user has left a comment.</small>

If any one can help me with this, it would very much appreciated.

Thank you.

15 answers to this question

Recommended Posts

  • 0
  • 0
  On 15/11/2010 at 02:39, Cupcakes said:

I'm trying to include it on a Themes Option page so that the function is already available to my users.

I don't want the plugin and I know WordPress has a drop down function already but it is not suitable for this section.

So if you can help me with what I have asked instead that would be helpful.

Thank you.

  • 0
  On 15/11/2010 at 03:26, Cupcakes said:

I didn't say to use the plugin... I said to just reference the links so you can utilize some of the functionality that's already there.

I have used the plugin for reference and it didn't help me. So can you help me with this?

  • 0

Change your function code to


function fetch_redirect_page(){
global $wpdb;
$pages = $wpdb->get_results("SELECT post_title, post_status, post_type FROM $wpdb->posts WHERE `post_status`='publish' AND `post_type`='page'");
$redirect = "";
foreach($pages as $key => $page) {
$redirect .= $page->post_title;
if($key != 0) {
$redirect .= ","
}
}
$redirect = explode(",", $redirect);
return $redirect;
}
[/CODE]

That'll make it into a proper array.

As for printing it into the HTML, if you show me the code you have for printing this section:

[CODE]
<label for="commentredirect">Redirect To</label>
<select name="commentredirect" id="commentredirect">
<option value="" about="" home="" blog="" contact="">"About""Home""Blog""Contact"</option>
</select>
<small>This will redirect the user to the page selected after the user has left a comment.</small>
[/CODE]

I will show you what you need to modify for it to work.

  • 0
  On 18/11/2010 at 20:02, DeathLace said:

Change your function code to

function fetch_redirect_page(){
        global $wpdb;
        $pages = $wpdb-&gt;get_results("SELECT post_title, post_status, post_type FROM $wpdb-&gt;posts WHERE `post_status`='publish' AND `post_type`='page'");
        $redirect = "";
        foreach($pages as $key =&gt; $page) {
                $redirect .= $page-&gt;post_title;
                if($key != 0) {
                     $redirect .= ","
                }
        }
        $redirect = explode(",", $redirect);
        return $redirect;
}
[/CODE]

That'll make it into a proper array.
As for printing it into the HTML, if you show me the code you have for printing this section:
[CODE]
&lt;label for="commentredirect"&gt;Redirect To&lt;/label&gt;
&lt;select name="commentredirect" id="commentredirect"&gt;
&lt;option value="" about="" home="" blog="" contact=""&gt;"About""Home""Blog""Contact"&lt;/option&gt;
&lt;/select&gt;
&lt;small&gt;This will redirect the user to the page selected after the user has left a comment.&lt;/small&gt;
[/CODE]

I will show you what you need to modify for it to work.

This function is working great already. This is what it prints now after adding the changes.
[code]&lt;select name="commentredirect" id="commentredirect"&gt;
&lt;option value="AboutHome"&gt;AboutHome&lt;/option&gt;
&lt;option value="Blog"&gt;Blog&lt;/option&gt;
&lt;option value="Contact"&gt;Contact&lt;/option&gt;
&lt;option value="" selected="selected"&gt;&lt;/option&gt;
&lt;/select&gt;

I don't know why two of the values have stuck to each other and why the empty value is at the bottom.

This is what it prints if I select one and save it as my option.

&lt;select name="commentredirect" id="commentredirect"&gt;
&lt;option value="AboutHome"&gt;AboutHome&lt;/option&gt;
&lt;option value="Blog" selected="selected"&gt;Blog&lt;/option&gt;
&lt;option value="Contact"&gt;Contact&lt;/option&gt;
&lt;option value="" selected="selected"&gt;&lt;/option&gt;
&lt;/select&gt;

This is what i use for my drop down menus. I have had no problems with it so far.

&lt;label for="&lt;?php echo $value['id']; ?&gt;"&gt;&lt;?php echo $value['name']; ?&gt;&lt;/label&gt;
&lt;select name="&lt;?php echo $value['id']; ?&gt;" id="&lt;?php echo $value['id']; ?&gt;"&gt;
&lt;?php foreach($value['options'] as $option){ ?&gt;
&lt;option value="&lt;?php echo $option; ?&gt;"&lt;?php if(get_settings($value['id']) == $option){ echo ' selected="selected"'; }elseif($option == $value['std']){ echo ' selected="selected"'; } ?&gt;&gt;&lt;?php echo ucwords($option); ?&gt;&lt;/option&gt;&lt;?php } ?&gt;
&lt;/select&gt;

So it's nearly there. What could be causing part of it to go wrong?

  • 0

I have tweaked it a little so now it echos the drop down menu correctly for each page as a separate option but I still get a blank option which is automatically selected at the bottom of the list.

function fetch_redirect_page(){
	global $wpdb;
	$pages = $wpdb-&gt;get_results("SELECT id, post_title FROM $wpdb-&gt;posts WHERE `post_status`='publish' AND `post_type`='page'");
	$redirect = "";
	foreach($pages as $key =&gt; $page){
		$redirect .= $page-&gt;id." =&gt; ".$page-&gt;post_title;
		if($key =! 0){ $redirect .= ", "; }
	}
	$redirect = explode(", ", $redirect);
	return $redirect;
}

I also need to fetch the page id as the value but I want the title to show as the option.

So far it prints out like this:

&lt;select name="commentredirect" id="commentredirect"&gt;
&lt;option value="2 =&gt; About"&gt;2 =&gt; About&lt;/option&gt;
&lt;option value="4 =&gt; Home"&gt;4 =&gt; Home&lt;/option&gt;
&lt;option value="6 =&gt; Blog"&gt;6 =&gt; Blog&lt;/option&gt;
&lt;option value="13 =&gt; Contact"&gt;13 =&gt; Contact&lt;/option&gt;
&lt;option value="" selected="selected"&gt;&lt;/option&gt;
&lt;/select&gt;

I now need it to print out like this:

&lt;select name="commentredirect" id="commentredirect"&gt;
&lt;option value="2"&gt;About&lt;/option&gt;
&lt;option value="4"&gt;Home&lt;/option&gt;
&lt;option value="6"&gt;Blog&lt;/option&gt;
&lt;option value="13"&gt;Contact&lt;/option&gt;
&lt;/select&gt;

  • 0

It appears to me that you are seriously over-complicating this problem. Why are you concatenating a string and then trying to get an associative array out of it? Just use an array from the start! :p

&lt;?php
function fetch_redirect_page(){
        $pages = get_pages();
        $redirect = array();
        foreach($pages as $page){
                $redirect[$page-&gt;ID] = $page-&gt;post_title;
        }
        return $redirect;
}
?&gt;

You want $redirect to be an array with page IDs as keys and titles as values, so you just loop over all pages and use those properties as key and value for a new element in $redirect. That's all you ever need, after that you can just return $redirect. :)

Note that I replaced your raw database query with a call to get_pages() which does exactly the same (return all published pages). It is highly recommended to use native WordPress functions wherever you can, especially when you're working with the database. ;)

  • 0
  On 22/11/2010 at 16:07, Calculator said:

It appears to me that you are seriously over-complicating this problem. Why are you concatenating a string and then trying to get an associative array out of it? Just use an array from the start! :p

&lt;?php
function fetch_redirect_page(){
        $pages = get_pages();
        $redirect = array();
        foreach($pages as $page){
                $redirect[$page-&gt;ID] = $page-&gt;post_title;
        }
        return $redirect;
}
?&gt;

You want $redirect to be an array with page IDs as keys and titles as values, so you just loop over all pages and use those properties as key and value for a new element in $redirect. That's all you ever need, after that you can just return $redirect. :)

Note that I replaced your raw database query with a call to get_pages() which does exactly the same (return all published pages). It is highly recommended to use native WordPress functions wherever you can, especially when you're working with the database. ;)

That does not give the options value as the page id, it gives me just the title as before. I need the values as the page id and have it display the title for each option.

I need it to display like this!

&lt;select name="commentredirect" id="commentredirect"&gt;
&lt;option value="2"&gt;About&lt;/option&gt;
&lt;option value="4"&gt;Home&lt;/option&gt;
&lt;option value="6"&gt;Blog&lt;/option&gt;
&lt;option value="13"&gt;Contact&lt;/option&gt;
&lt;/select&gt;

Not like this!

&lt;select name="commentredirect" id="commentredirect"&gt;
&lt;option value="About"&gt;About&lt;/option&gt;
&lt;option value="Home"&gt;Home&lt;/option&gt;
&lt;option value="Blog"&gt;Blog&lt;/option&gt;
&lt;option value="Contact"&gt;Contact&lt;/option&gt;
&lt;/select&gt;

  • 0

It looks to me that the fault is with the function you're passing that array to, I believe the implementation doesn't take array keys in account to generate the <select>.

I did a quick Google search and I found out that this option structure is used in this article about theme options. After going through the code of that article, I found that the <select> generation code does not take array keys as option value attributes.

&lt;td width="80%"&gt;
&lt;select style="width:240px;" name="&lt;?php echo $value['id']; ?&gt;" id="&lt;?php echo $value['id']; ?&gt;"&gt;
&lt;?php foreach ($value['options'] as $option) { ?&gt;
&lt;option&lt;?php if ( get_settings( $value['id'] ) == $option) { echo ' selected="selected"'; } elseif ($option == $value['std']) { echo ' selected="selected"'; } ?&gt;&gt;&lt;?php echo $option; ?&gt;&lt;/option&gt;
&lt;?php } ?&gt;
&lt;/select&gt;
&lt;/td&gt;

Here, we see that the foreach loop doesn't use a key variable and that the generated HTML doesn't contain a value attribute. My guess is that the value attribute you're seeing in the HTML is copied from a DOM inspector like Firebug which shows the parsed HTML DOM with the missing attributes added.

If all my assumptions are correct, then you should be able to fix this by just changing the piece of code mentioned above with:

&lt;td width="80%"&gt;
&lt;select style="width:240px;" name="&lt;?php echo esc_attr($value['id']); ?&gt;" id="&lt;?php echo esc_attr($value['id']); ?&gt;"&gt;
&lt;?php foreach ($value['options'] as $option_key =&gt; $option_name) { ?&gt;
&lt;option value="&lt;?php echo esc_attr($option_key) ?&gt;"&lt;?php if ( get_settings( $value['id'] ) == $option_key || $value['std'] == $option_key) { echo ' selected="selected"'; } ?&gt;&gt;&lt;?php echo esc_html($option_name); ?&gt;&lt;/option&gt;
&lt;?php } ?&gt;
&lt;/select&gt;
&lt;/td&gt;

Note that I added esc_attr() and esc_html() calls to the echo statements, these are utility functions provided by WordPress which escape characters for HTML output, such as quotes and backslashes. It's a good coding practice to sanitize your input and output, I can guarantee it'll save you headaches. ;)

If this isn't the code you're using, then please provide us with some more details about where your array is used. It is tough for us to help you if we don't know what you're using. ;)

  • 0

Thank you very much I got the drop down now loading correctly on my options page. Now I need to fix a small problem with my filter.

It seems to be ignoring the new page redirection option and go back to the page or post the user commented on. Please can anyone take a look and see what is missing or incorrect.

This is what I have so far.

// Redirects commenter to another page.
function change_redirect($location){
	global $wpdb, $framework, $comment;
	$cc = $wpdb-&gt;get_var("SELECT COUNT(comment_author_email) FROM $wpdb-&gt;comments WHERE comment_author_email='".$comment-&gt;comment_author_email."'");
	if($cc == 1){
		$location = get_option($framework."_commentredirect");
		return get_permalink($location);
	}
	else{
		return $location;
	}
}
add_filter('comment_post_redirect','change_redirect');

Thank you.

  • 0

What is the value of that "$framework_comemntredirect" option? Is it an URL or a post ID? get_permalink() only accepts a post ID as its first parameter. Other than that, I don't really see what could be the problem...

Try some debugging. Throw in some echo()s and var_dump()s to monitor the state of your variables during execution. Make sure that your filter gets triggered properly by echo()ing "Hello world" or something.

If you manage to pinpoint the position where your code fails, you might be able to figure it out yourself. If not, post about it here. :)

  • 0
  On 24/11/2010 at 09:54, Calculator said:

What is the value of that "$framework_comemntredirect" option? Is it an URL or a post ID? get_permalink() only accepts a post ID as its first parameter. Other than that, I don't really see what could be the problem...

Try some debugging. Throw in some echo()s and var_dump()s to monitor the state of your variables during execution. Make sure that your filter gets triggered properly by echo()ing "Hello world" or something.

If you manage to pinpoint the position where your code fails, you might be able to figure it out yourself. If not, post about it here. :)

It should get the post ID from the options that is saved as "$framework_commentredirect". I checked to see if the option was saved as a post ID and it is.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I think it is more to do with the wider channels, so more data can be sent at the same time, not about frequencies. No doubt some other things as well.
    • UniGetUI 3.3.0 by Razvan Serea UniGetUI is an application whose main goal is to create an intuitive GUI for the most common CLI package managers for Windows 10 and Windows 11, such as Winget, Scoop and Chocolatey. With UniGetUI, you'll be able to download, install, update and uninstall any software that's published on the supported package managers — and so much more. UniGetUI features Install, update and remove software from your system easily at one click: UniGetUI combines the packages from the most used package managers for windows: WinGet, Chocolatey, Scoop, Pip, Npm and .NET Tool. Discover new packages and filter them to easily find the package you want. View detailed metadata about any package before installing it. Get the direct download URL or the name of the publisher, as well as the size of the download. Easily bulk-install, update or uninstall multiple packages at once selecting multiple packages before performing an operation Automatically update packages, or be notified when updates become available. Skip versions or completely ignore updates in a per-package basis. Manage your available updates at the touch of a button from the Widgets pane or from Dev Home pane with UniGetUI Widgets. The system tray icon will also show the available updates and installed package, to efficiently update a program or remove a package from your system. Easily customize how and where packages are installed. Select different installation options and switches for each package. Install an older version or force to install a 32bit architecture. [But don't worry, those options will be saved for future updates for this package] Share packages with your friends to show them off that program you found. Here is an example: Hey @friend, Check out this program! Export custom lists of packages to then import them to another machine and install those packages with previously-specified, custom installation parameters. Setting up machines or configuring a specific software setup has never been easier. Backup your packages to a local file to easily recover your setup in a matter of seconds when migrating to a new machine UniGetUI 3.3.0 release notes: This release was expected to be 3.2.1, but it incudes more changes than planned, so it has been named 3.3.0 instead. Changelog Added default install options on a per-package-manager level! Added pre/post-install/update/uninstall commands! Added an option to close/kill process(es) before installing/updating/uninstalling a package Added cloud package backup and restore (via GitHub) more info on that here. Added the option to bulk-download installers Added the option to select package manager executable PowerShell7 can now clear older versions when updating to a new one Improvements to InstallOptions dialogs Installer download will properly guess the downloaded file name. Added "Dependencies" field to Package Details. Improvements to WinGet source management Searchbox has been moved to the titiebar, less wasted space Improvements for when window size is less wide Toolbar improvements Improvements on internal error detection and handling YAML and XML can't be created no more (more info on that here: #3860) Lots of bugfixes Other internal improvements Security enhancements Some features (pre/post install commands, command-line arguments, etc.) will be restricted by default. Bundles will also have those features restricted by default. Those features can be enabled with toggles that require an UAC prompt to be modified Bundles will show a security report when potentially dangerous settings are present. Fix some potential command-injection vulnerabilities from custom command-line arguments What's changed Load translations from Tolgee by @martinet101 in #3644 Dynamic JSON [de]serialization by @marticliment in #3679 Bump vedantmgoyal9/winget-releaser from 3e78d7ff0f525445bca5d6a989d31cdca383372e to 19e706d4c9121098010096f9c495a70a7518b30f in the actions-deps group by @dependabot[bot] in #3711 Update Scoop nirsoft bucket URL to ScoopInstaller/Nirsoft by @hboyd2003 in #3719 Per-package-manager and global default installation options by @marticliment in #3685 Further improvements to InstallOptions by @marticliment in #3721 Add toggle to enable/disable insecure settings by @marticliment in #3722 Make 'Pause updates for' submenu item use translation by @szumsky in #3705 Add toggle to enable/disable insecure settings by @marticliment in #3723 Separe Install, update and uninstall custom command-line args by @marticliment in #3748 Warn the user when a bundle contains potentially harmful prefs by @marticliment in #3749 Setting keys will be stored on const strings by @marticliment in #3750 Improve local icon detection code comments by @mrixner in #3767 Pre-install and post-install operations by @marticliment in #3756 Show Version in Update Live Dialog by @mrixner in #3798 Clear older versions of PowerShell7 modules on update by @marticliment in #3810 Allow Executable Selection by @mrixner in #3703 Add dependencies field to Package Details by @marticliment in #3822 Feat/recheck version before update by @theguy000 in #3827 feat: Add Cloud Backup and Restore via GitHub Gists by @theguy000 in #3826 Bundles file size improvements by @marticliment in #3832 Move searchbox to titlebar by @marticliment in #3837 Fix crashes & better error handling by @marticliment in #3859 Improvements to WinGet source management by @marticliment in #3876 Allow the user to force user gsudo via a SecureSetting (fix #3692) by @marticliment in #3877 Improvements to Toolbar by @marticliment in #3882 Download: UniGetUI 3.3.0 | 53.3 MB (Open Source) Links: WingetUI Home Page | GitHub | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • You wouldn't buy a car if you had to disassemble half the vehicle to do an oil change. The same is true in software. There comes a point where company A's desire to maximize profits hurts consumers.
    • RoboForm 9.7.8 by Razvan Serea RoboForm is the top-rated Password Manager and Web Form Filler that completely automates password entering and form filling. RoboForm makes logging into Web sites and filling forms faster, easier, and more secure. RoboForm memorizes and securely stores each user name and password the first time you log into a site, then automatically supplies them when you return. RoboForm's powerful Logins feature eliminates the manual steps of logging into any online account. With just one click RoboForm will navigate to a Web site, enter your username and password and click the submit button for you. Completing long registration or checkout forms is also a breeze. Simply click on your RoboForm Identity and RoboForm fills-in the entire form for you. You no longer need to remember all your passwords. You remember one Master Password, and RoboForm remembers the rest. This allows you to use stronger passwords, making your online experience more secure. RoboForm uses strong AES encryption for complete data security. The all new RoboForm comes with Chrome and Safari browser support, iPhone/iPad and Android support, as well a brand new RoboForm Everywhere license for use on unlimited computers and mobile devices. RoboForm 9.7.8 changelog: Fixed misc bugs in RF Desktop Unlock UI. Fixed a crash when RoboForm data folder does not exist. Download: RoboForm 9.7.8 | 42.3 MB (Free, paid upgrade available) View: RoboForm Website Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Elephants, vegetarians, eat raw yams, Otherwise, never eat..
  • Recent Achievements

    • One Month Later
      Ricky Chan earned a badge
      One Month Later
    • First Post
      leoniDAM earned a badge
      First Post
    • Reacting Well
      Ian_ earned a badge
      Reacting Well
    • One Month Later
      Ian_ earned a badge
      One Month Later
    • Dedicated
      MacDaddyAz earned a badge
      Dedicated
  • Popular Contributors

    1. 1
      +primortal
      506
    2. 2
      ATLien_0
      207
    3. 3
      Michael Scrip
      205
    4. 4
      Xenon
      141
    5. 5
      +FloatingFatMan
      116
  • Tell a friend

    Love Neowin? Tell a friend!